2017-08-15 72 views
3

我正在绘制ggplot2中的堆栈barplot。我的数据集是一样,如何控制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个处理,这五个处理属于两个组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中的两个组。

+0

的可能的复制[用于GGPLOT2组合重组数据分组和堆积条形图使用Tidyverse](https://stackoverflow.com/questions/44106032/restructuring-data-for-ggplot2-combination-grouped-and-stacked-条形图使用ti) – Masoud

+0

[如何在R中的分组条形图中生成堆积条形图]的可能副本(https://stackoverflow.com/questions/18774632/how-to-produce-stacked-bars-within-grouped-barchart -in-R?noredirect = 1&LQ = 1) – Masoud

回答

3

“复制问题”的评论将导致你的答案像这样的:

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

enter image description here

而且这种解决方案有时是伟大的!其优点是:

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

enter image description here

主要缺点这种方法:

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

enter image description here

该解决方案具有其自身的缺点,主要是你只能自定义空间以有限的方式。您可以创建一个“假”条,该条等于您已获得的条的宽度的整数倍,方法是向限制,中断和标签添加更多的假级别。但是你不能创造出只有半个酒吧宽的空间。

你可以在错误的酒吧空间,虽然提供了更多的信息:

  1. 添加文本注释在绘图区
  2. trt99"<-group1 | group2->"或类似的东西替换breaksNA""labels
0

我认为你只需要为你的数据集创建一个新的列,其标签的一切是“治疗3”和“不治疗3”。我用dplyr包:以上

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