如何控制ggplot2中堆栈栏之间的空间? [英] How to control space between stack bars in ggplot2?

查看:273
本文介绍了如何控制ggplot2中堆栈栏之间的空间?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在ggplot2中绘制一个堆栈barplot。我的数据集就像是,

  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个测量值,它们的值存储在中。



我想绘制一张图来比较这五种治疗方法及其测量结果。
,所以我绘制了如下图所示的堆栈条:



我的代码:

  library(ggplot2)
colourCount = length(唯一的(mydata $ var3))
getPalette = colorRampPalette(brewer.pal 14,YlGnBu))#从调色板中获取更多颜色

ggplot(data = mydata,aes(x = var1,y = value,fill = var3))+
geom_bar(stat =identity,position =stack,color =black,width = 0.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 。

解决方

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


ggplot(dummydf,aes(var1,value,fill = var3))+
geom_col(position =stack)+
facet_grid(〜var2,scales =free_x,space =free_x)



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

  • 实现起来非常简单
  • 包含分层分组标签顶部

  • 通常看起来不错

  • 很容易定制。

  • 例如:

      ggplot(dummydf,aes(var1,value,fill = var3))+ 
    geom_col(position =stack)+
    facet_grid(〜var2,scales =free_x,space =free_x) +
    主题(panel.spacing = unit(3,cm),
    strip.text = element_text(size = 12,family =mono))



    主要缺点到这个方法:


    1. 如果这已经是一个面板拼图的一部分,它会让
      整件事变得混乱。

      li>
    2. 如果您的分层组从治疗中显而易见,则您可能不需要明确标注,只需快速区分视觉。例如,假设这些组是控制/干预,而您的
      治疗是无药物,安慰剂和药物1,2和3。
    3. ol>

      所以这里有一个替代方法:

        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. 替换 NA 中断标签中使用 trt99 < -group1 | group2->或类似的东西。


      I'm plotting a stack barplot in ggplot2. My dataset is like,

      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 contains 5 treatments, these five treatments belong to two groups in var2, and each treatment has 14 measurements in var3, their value stored in value.

      I want to make a plot to compare these five treatments, and their measurements. so I plot with stack bar plot like this figure:

      My code:

      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
      

      How could I group the first two stacked columns together, and the other three columns together? Because they belong to two groups in var2.

      解决方案

      The "duplicate question" comments above will lead you to an answer like this one:

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

      And this solution is sometimes great! The advantages are:

      1. it's simple to implement
      2. contains the labels for the hierarchical grouping at the top
      3. generally looks nice
      4. is easily customizable.

      For example:

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

      The main disadvantages to this method:

      1. If this is already part of a facet panelled plot, it makes the whole thing cluttered.
      2. If your hierarchical groups are obvious from the treatments, you may not need explicit labelling, just a quick visual distinction. For example, say the groups are control/intervention, and your treatments are "no drug, placebo" and "drugs 1, 2, and 3".

      So here's an alternate method:

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

      This solution has its own drawbacks, primarily that you can only customize the space in a limited way. You can create a "false" bar equal to an integer multiple of the widths of the bars you've already got by adding additional false levels to your limits, breaks, and labels. But you can't create a space that's only half a bar wide.

      You could provide additional information in the false bar space though:

      1. Adding a text annotation in the plot area
      2. Replacing the NA and "" in breaks and labels with trt99 and "<-group1 | group2->" or something similar.

      这篇关于如何控制ggplot2中堆栈栏之间的空间?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

    查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆