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

时间:2017-08-15 20:59:24

标签: r plot ggplot2 stack bar-chart

我正在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。< / p>

我想制作一个情节来比较这五种治疗方法及其测量结果。 所以我用堆栈条图绘制如下图: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中的两个组。

2 个答案:

答案 0 :(得分:4)

&#34;重复的问题&#34;上面的评论将引导您得到如下答案:

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

enter image description here

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

  1. 实施起来很简单
  2. 包含顶部分层分组的标签
  3. 一般看起来不错
  4. 很容易定制。
  5. 例如:

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

    enter image description here

    此方法的主要缺点:

    1. 如果这已经是一个方面拼接图的一部分,它就会成为 整件事情凌乱不堪。
    2. 如果您的等级组在治疗中显而易见,您可能不需要明确标记,只需要快速视觉区分。 例如,假设这些组是控制/干预,而你的 治疗方法是没有药物,安慰剂和#34;和#34;药物1,2和3&#34;。
    3. 所以这是另一种方法:

      NA

      enter image description here

      此解决方案有其自身的缺点,主要是您只能以有限的方式自定义空间。你可以创建一个&#34; false&#34; bar等于您已经通过向限制,中断和标签添加其他错误级别而获得的条形宽度的整数倍。但是你不能创造一个只有半个条宽的空间。

      您可以在虚假栏空间中提供其他信息:

      1. 在绘图区添加文本注释
      2. ""breaks或类似内容替换labelstrt99中的"<-group1 | group2->"和{{1}}。

答案 1 :(得分:0)

我认为您只需要在数据集中创建一个新列,标记所有内容&#34; treatment3&#34;并且&#34;不是治疗3&#34;。我使用了dplyr包:

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