我有以下数据集:
eg_data <- data.frame(
time = c("1","2"),
size1=c(200, 300))
我在数据集中添加了两个时间段之和的行:
eg_data <- rbind(eg_data, (data.frame(time="1 + 2",
size1=sum(eg_data$size1))))
eg_data$time <- factor(eg_data$time, levels = c("1 + 2", "1", "2"))
我创建一个条形图
eg_data_bar <- (ggplot() +
geom_bar(data=eg_data, aes(y = size1, x = time, fill = time),
stat="identity",position='stack'))
eg_data_bar
目前,该图呈现为三个不同颜色的条形图。我需要条形图将其渲染为三个条形,周期1是一种颜色,周期2是另一种颜色,分组的周期1 + 2由周期1和周期2的两种颜色组成。
我遇到的问题是如何在geom_bar()中定义填充。之前完成堆叠的条形图时,我总是会有第三列用作填充。
感谢您的帮助。
答案 0 :(得分:2)
也许是这样吗?
我们从您最初的eg_data
data.frame
开始:
eg_data <- data.frame(
time = c("1","2"),
size1 = c(200, 300))
library(tidyverse)
eg_data %>%
mutate(grp = factor(time, levels = 1:2)) %>%
group_by(time) %>%
complete(grp) %>%
replace_na(list(size1 = 0)) %>%
ungroup() %>%
spread(time, size1) %>%
mutate(`1+2` = `1` + `2`) %>%
gather(time, size, -grp) %>%
mutate(time = factor(time, levels = c("1", "2", "1+2"))) %>%
ggplot(aes(time, size, fill = grp)) +
geom_col(position = "stack")
关键是添加一个额外的grp
变量,我们将使用该变量来fill
条形图。
下面的解决方案是上面的解决方案,它将grp添加到数据框并创建图形作为其自己的对象,因此可以称为即席(ad-hoc)。
eg_data <- eg_data %>%
mutate(grp = factor(time, levels = 1:2)) %>%
group_by(time) %>%
complete(grp) %>%
replace_na(list(size1 = 0)) %>%
ungroup() %>%
spread(time, size1) %>%
mutate(`1+2` = `1` + `2`) %>%
gather(time, size1, -grp) %>%
mutate(time = factor(time, levels = c("1", "2", "1+2")))
eg_data_graph <- (ggplot(data = eg_data, aes(time, size1, fill = grp)) +
geom_col(position = "stack"))
eg_data_graph