创建组内总计的堆叠条形图

时间:2018-12-06 22:40:20

标签: r ggplot2 bar-chart

我有以下数据集:

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()中定义填充。之前完成堆叠的条形图时,我总是会有第三列用作填充。

感谢您的帮助。

1 个答案:

答案 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")

enter image description here

关键是添加一个额外的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