【问题标题】:How to control space between stack bars in ggplot2?如何控制ggplot2中堆栈栏之间的空间?
【发布时间】:2018-01-23 21:10:33
【问题描述】:

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

我想制作一个图来比较这五种治疗方法及其测量值。 所以我用堆栈条图绘制如下图:

我的代码:

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 plot ggplot2 stack bar-chart


【解决方案1】:

上面的“重复问题”cmets 将引导您得到这样的答案:

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. breakslabels 中的NA"" 替换为trt99"&lt;-group1 | group2-&gt;" 或类似的东西。

【讨论】:

    【解决方案2】:

    我认为您只需要为您的数据集创建一个新列,将所有内容标记为“治疗 3”和“非治疗 3”。我用dplyr包:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-24
      • 2021-12-31
      • 1970-01-01
      相关资源
      最近更新 更多