gpt4 book ai didi

r - 如何删除堆叠的 geom_col 之间的空白

转载 作者:行者123 更新时间:2023-12-04 11:17:50 24 4
gpt4 key购买 nike

library(tidyverse)
library(lubridate)

date <- seq(ymd('2018-08-01'), ymd('2018-08-31'), by = '1 day')
c <- 21.30
x1 <- runif(length(date), 0, 20)
x2 <- rnorm(length(date), 10, 3)
x3 <- abs(rnorm(length(date), 40, 10))
data <- data.frame(c, x1, x2, x3) %>%
t() %>% as.data.frame() %>% rownames_to_column('var')
data <- data %>%
mutate(category1 = c('catA', 'catB', 'catB', 'catC') %>% as.factor(),
category2 = c('catAA', 'catBA', 'catBB', 'catCA') %>% as.factor())
names(data) <- c('var', as.character(date), 'category1', 'category2')
data_long <- data %>%
gather(date, value, -var, -category1, -category2) %>%
mutate(date = ymd(date))

data_long %>%
ggplot(aes(date, value, fill = category1)) +
geom_col(position = 'stack') +
scale_x_date(breaks = '1 week', date_labels = '%Y-%m-%d', expand = c(.01, .01)) +
theme_minimal() +
theme(axis.text.x = element_text(angle = 90, vjust = .4)) +
labs(fill = '')

使用上面的示例数据和代码,我生成了以下图:
enter image description here

我需要做的是删除列之间的空格。我找到了一些类似的主题,但他们推荐使用 position_dodge()虽然它不能用于我的情况,因为我已经有了 position = 'stack' ,无法替代。那么如何使列彼此相邻?

编辑

设置 width = 1 ,正如@camille 所提出的,似乎可以处理原始数据,但不能汇总到几周或几个月 - 请参阅下面的代码:
data_long %>%
mutate(date = floor_date(date, unit = 'week', week_start = 1)) %>%
group_by(category1, date) %>%
summarise(value = sum(value, na.rm = TRUE)) %>%
ungroup() %>%
ggplot(aes(date, value, fill = category1, width = 1)) +
geom_col(position = 'stack') +
scale_x_date(breaks = '1 month', date_labels = '%Y-%m', expand = c(.01, .01)) +
theme_minimal() +
theme(axis.text.x = element_text(angle = 90, vjust = .4)) +
labs(fill = '')

enter image description here

编辑 2。

正如@Camille 所指出的,在日期比例的情况下,宽度 1 可能指 1 天。但是,以下不会产生预期的输出并返回警告消息: position_stack requires non-overlapping x intervals
 data_long %>%
mutate(date = floor_date(date, unit = 'month', week_start = 1)) %>%
group_by(category1, date) %>%
summarise(value = sum(value, na.rm = TRUE),
n = n()) %>%
ungroup() %>%
ggplot(aes(date, value, fill = category1, width = n)) +
geom_col(position = 'stack') +
scale_x_date(breaks = '1 month', date_labels = '%Y-%m', expand = c(.01, .01)) +
theme_minimal() +
theme(axis.text.x = element_text(angle = 90, vjust = .4)) +
labs(fill = '')

enter image description here

最佳答案

geom_col 的文档比我在上面的评论中提出的更具体。 width参数更详细的含义:

Bar width. By default, set to 90% of the resolution of the data.



在一般情况下,例如您的第一个案例,这可能仅表示一个离散案例与另一个案例之间的距离。但是对于具有真正分辨率的日期,这似乎是指天。我不确定是否有不同的方式来设置日期的分辨率,例如一个单位指的是一周,而不是一天。

我正在降低 alpha 只是为了能够查看条形是否重叠。

因此,如果不设置宽度,则默认为观测值之间距离的 90%,即一周的 90%。

library(tidyverse)
library(lubridate)
...

summarized <- data_long %>%
mutate(date = floor_date(date, unit = 'week', week_start = 1)) %>%
group_by(category1, date) %>%
summarise(value = sum(value, na.rm = TRUE)) %>%
ungroup()

ggplot(summarized, aes(date, value, fill = category1)) +
geom_col(alpha = 0.6) +
scale_x_date(breaks = '1 week', expand = c(.01, .01))



将宽度设置为 1 表示宽度为 1 天。我觉得这里有一个其他人可能能够解释的差异,为什么这被视为 1 天而不是 100% 的分辨率。

ggplot(summarized, aes(date, value, fill = category1)) +
geom_col(alpha = 0.6, width = 1) +
scale_x_date(breaks = '1 week', expand = c(.01, .01))



因此,要获得 1 周的宽度,也就是 7 天,请将宽度设置为 7。同样,我认为其他人可以在这里填写一些解释。

ggplot(summarized, aes(date, value, fill = category1)) +
geom_col(alpha = 0.6, width = 7) +
scale_x_date(breaks = '1 week', expand = c(.01, .01))



编辑:基于 link in my comment ,最好的方法可能只是将日期转换为字符串,这样您就可以像往常一样在离散的 x 尺度上绘图。在您调用之前 as.character ,你可以做任何你想要的格式。

summarized %>%
mutate(date = as.character(date)) %>%
ggplot(aes(x = date, y = value, fill = category1)) +
geom_col(width = 1)

关于r - 如何删除堆叠的 geom_col 之间的空白,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53068035/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com