如何在ggplot2中控制堆积条之间的间距?

5

我正在使用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

var1 包含 5 种治疗方法,这 5 种治疗方法属于 var2 中的两个组,并且每种治疗方法在 var3 中有 14 个测量值,它们的值存储在 value 中。

我想要绘制一个图表来比较这五种治疗方法及其测量值。所以我使用堆积条形图绘制如下图:enter image description here

我的代码:

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

如何将前两个叠加的列分为一组,将另外三列分为另一组? 因为它们属于 var2 中的两个组。


可能是[如何在R中生成分组条形图内的堆叠条形图]的重复问题(https://dev59.com/jGMl5IYBdhLWcg3wAC2h?noredirect=1&lq=1)。 - M--
2个回答

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

在此输入图片描述

而且这种解决方案有时候非常好!它的优点包括:

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

在此输入图片描述

这种方法的主要缺点:

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

在此输入图片描述

这种解决方案也有自己的缺点,主要是你只能以有限的方式定制空间。你可以通过在极限、间断和标签中添加额外的虚假级别来创建一个等于已经拥有的条形宽度的整数倍的“虚假”条形。但是你无法创建只有半个条形宽度的空间。

不过,你可以在虚假的条形空间中提供额外的信息:

  1. 在绘图区域添加文本注释
  2. trt99"<-group1 | group2->" 或类似的内容替换 breakslabels 中的 NA""

0

我认为你只需要在数据集中创建一个新列,将所有标签设置为“treatment3”和“not treatment3”。我使用了dplyr包:

df1 = dplyr::mutate(mydata, 
    var4 = ifelse(var1 == "treatment3", "treatment3", "not treatmeant3"))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接