如何在ggplot2中控制堆栈条之间的空间?

Jel*_*llz 5 plot stack r bar-chart ggplot2

我正在ggplot2中绘制堆栈条形图。我的数据集就像

var1         var2   var3       value
treatment1  group_1 C8.0    0.010056478
treatment2  group_1 C8.0    0.009382918
treatment3  group_2 C8.0    0.003014983
treatment4  group_2 C8.0    0.005349631
treatment5  group_2 C8.0    0.005349631
Run Code Online (Sandbox Code Playgroud)

var1包含5个处理,这五个处理属于中的两个组var2,每个处理中有14个测量var3值,其值存储在中value

我想作图比较这五种治疗方法及其测量值。所以我用堆栈条形图绘制如下图:在此处输入图片说明

我的代码:

library(ggplot2)
colourCount = length(unique(mydata$var3))
getPalette = colorRampPalette(brewer.pal(14, "YlGnBu")) #get more color from palette

ggplot(data=mydata, aes(x=var1, y=value, fill=var3))+
  geom_bar(stat="identity", position="stack", colour="black", width=.2)+
  *#geom_errorbar(aes(ymax=var3+se, ymin=var3-se, width=.1))+*
  scale_fill_manual(values = getPalette(colourCount))+

  scale_y_continuous(expand = c(0, 0))+
  mytheme
Run Code Online (Sandbox Code Playgroud)

我如何将前两列堆叠在一起,而其他三列合并在一起?因为它们属于中的两个组var2

Bri*_*ian 5

上面的“重复问题”注释将使您得到这样的答案:

library(dplyr)
library(ggplot2)
dummydf <- expand.grid(var1 = paste0("trt", 1:5),
            var3 = paste0("C_", 11:15)) %>% 
  mutate(value = runif(length(var1)),
         var2 = ifelse(var1 %in% c("trt1", "trt2"), "grp1", "grp2"))


  ggplot(dummydf, aes(var1, value, fill = var3)) +
  geom_col(position = "stack") +
  facet_grid(~var2, scales = "free_x", space = "free_x") 
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

这个解决方案有时很棒!优点是:

  1. 实施起来很简单
  2. 在顶部包含层次结构分组的标签
  3. 通常看起来不错
  4. 易于定制。

例如:

  ggplot(dummydf, aes(var1, value, fill = var3)) +
  geom_col(position = "stack") +
  facet_grid(~var2, scales = "free_x", space = "free_x") +
  theme(panel.spacing = unit(3, "cm"),
        strip.text = element_text(size = 12, family = "mono"))
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

此方法的主要缺点:

  1. 如果这已经是分面拼版图的一部分,那么会使整个事情变得混乱。
  2. 如果从治疗中可以明显看出您的分层组,则可能不需要显式标记,只需快速地进行视觉区分即可。例如,假设这些组是对照/干预,而您的治疗是“无药,无安慰剂”和“药物1、2和3”。

因此,这是另一种方法:

dummydf %>% 
  bind_rows(data_frame(var1 = "trt99")) %>% 
  ggplot(aes(var1, value, fill = var3)) +
  geom_col(position = "stack") +
  scale_x_discrete(limits = c("trt1", "trt2", "trt99", "trt3", "trt4", "trt5"),
                   breaks = c("trt1", "trt2",      NA, "trt3", "trt4", "trt5"),
                   labels = c("trt1", "trt2",      "", "trt3", "trt4", "trt5"))
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

该解决方案有其自身的缺点,主要是您只能以有限的方式自定义空间。您可以通过在限制,中断和标签上添加其他错误级别,来创建等于已获得宽度宽度整数倍的“错误”栏。但是您不能创建只有半个栏宽的空间。

不过,您可以在假条空间中提供其他信息:

  1. 在绘图区域添加文本注释
  2. 更换NA""breakslabelstrt99"<-group1 | group2->"或类似的东西。