【发布时间】:2018-10-30 15:42:53
【问题描述】:
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 = '')
我需要做的是删除列之间的空格。我发现了一些类似的主题,但他们建议使用position_dodge(),而在我的情况下不能使用它,因为我已经有position = 'stack',无法替换。那我怎样才能使列彼此相邻呢?
编辑
@camille 提议的设置 width = 1 似乎可以处理原始数据,但不能汇总到几周或几个月 - 请参阅下面的代码:
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 = '')
编辑 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 = '')
【问题讨论】:
-
width = 1?默认情况下,根据?geom_col,宽度 = 0.9 -
似乎可以处理原始数据,但不能处理汇总数据 - 请参阅我的编辑。
-
嗨,我如何摆脱警告
position_stack requires non-overlapping x intervals?这真是脖子疼。