首页 > 解决方案 > GGplot:并排的两个堆叠条形图(不是构面)

问题描述

我正在尝试ggplot2在 R 中使用重新创建此解决方案:组合两个堆叠条形图以获得分组堆叠条形图

diamonds %>% 
  filter(color=="D"|color=="E"|color=="F") %>% 
  mutate(dummy=rep(c("a","b"),each=13057)) %>% 
  ggplot(aes(x=color,y=price))+
  geom_bar(aes(fill=clarity),stat="identity",width=.25)+
  facet_wrap(~cut)

在此处输入图像描述

我向数据集添加了一个新变量,diamonds名为dummy. dummy有两个值:ab。假设我想通过创建一个条形图来比较这两个值,该条形图对于 的每个值都有两个彼此相邻的堆叠条(每个值一个dummycolor。我怎样才能操纵这个,使得每个值都有两个堆叠条color

我认为这将涉及position dodge和/或单独的legend,但到目前为止我一直没有成功。我不想添加另一个方面 - 我希望这些都在每个方面的 x 轴上。

标签: rggplot2positiongeom-barfacet-wrap

解决方案


与帖子中的方法类似,您已经链接了一个选项来实现您想要的结果,这将是通过两个geom_col并将 x 轴变量转换为numeric类似的变量。但是,这样做需要通过手动设置中断和标签scale_x_continuous。此外,我利用该ggnewscale包添加了第二个填充比例:

library(ggplot2)
library(dplyr)

d <- diamonds %>%
  filter(color == "D" | color == "E" | color == "F") %>%
  mutate(dummy = rep(c("a", "b"), each = 13057))

ggplot(mapping = aes(y = price)) +
  geom_col(data = filter(d, dummy == "a"), aes(x = as.numeric(color) - .15, fill = clarity), width = .3) +
  scale_fill_viridis_d(name = "a", guide = guide_legend(order = 1)) +
  scale_x_continuous(breaks = seq_along(levels(d$color)), labels = levels(d$color)) +
  ggnewscale::new_scale_fill() +
  geom_col(data = filter(d, dummy == "b"), aes(x = as.numeric(color) + .15, fill = clarity), width = .3) +
  scale_fill_viridis_d(name = "b", option = "B", guide = guide_legend(order = 2)) +
  facet_wrap(~cut)


推荐阅读