将Stacked和Side-by-side条形图组合在一起

时间:2017-02-17 20:41:52

标签: r ggplot2

我正在创建2个条形图,第一个高度是3个值的总和,我想用不同的颜色显示。我可以创建该图,如下所示:

library(reshape)
library(ggplot2)
data1 <- data.frame("Year" = c(2011, 2012, 2013, 2014, 2015, 2016),
                         "Item1" = c(47.3, 46.3, 49.9, 50.1, 50.9, 47.2),
                         "Item2" = c(26.9, 58.9, 2.0, 11.5, 11.5, 5.3),
                         "Item3" = c(25.8, 24.9, 24.9, 25.4, 25.3, 25.6))
mdata <- melt(data1, id.var = "Year")
plot(ggplot(mdata, aes(x = Year, y = value, fill = variable)) + 
   geom_bar(stat = "identity"))

我的第二个情节更容易,只有一个条形,其值决定了条形的高度。生成该图的代码是:

data2 <- data.frame("Year" = c(2011, 2012, 2013, 2014, 2015, 2016),
                        "Value" = c(85.1, 83.4, 86.9, 87.6, 88.4, 85.6))
plot(ggplot(data2, aes(x = Year, y = Value)) + 
   geom_bar(stat = "identity"))

我想在同一个图中并排显示这两个条形图,因此2011年被分组,2012年被分组等等。我无法弄清楚如何添加第二个图。有帮助吗?谢谢!

2 个答案:

答案 0 :(得分:0)

您可以添加分组列,然后根据离散比例绘制它们。

data3    <- merge(data1, data2, by = 'Year')
data3    <- melt(data3, id.var = 'Year')
data3$gr <- paste0(data3$Year, ifelse(data3$variable == 'Value', '.b', '.a'))

ggplot(data3, aes(x = gr, y = value, fill = variable)) +
    geom_col()

如果您想直接通过

,请使用dplyr
data1 %>% full_join(data2) %>% 
     gather(Item, value, -Year) %>%
     mutate(gr = paste0(Year, ifelse(Item == 'Value', '.b', '.a'))) %>% 

     ggplot(aes(x = gr, y = value, fill = Item)) +
     geom_col()

这将给出同样绘制闪避和叠加的外观。但是,一个缺点是Y轴上的标签反映了分组变量而不是年份。我曾尝试过几次更改这些,但还没想出来。

enter image description here

答案 1 :(得分:0)

感谢大家的反馈。基于答案,我选择稍微改变我的方法并使用线图而不是第二个条形图。这传达了相同的信息,而不是我原本想要的信息。再次感谢!