ggplot2:geom_bar 与组,position_dodge 和填充

Posted

技术标签:

【中文标题】ggplot2:geom_bar 与组,position_dodge 和填充【英文标题】:ggplot2: geom_bar with group, position_dodge and fill 【发布时间】:2015-10-19 15:55:33 【问题描述】:

我正在尝试生成一个条形图,以便 x 轴由患者组成,每个患者都有多个样本。例如(使用 mtcars 数据作为数据外观的模板):

library("ggplot2")
ggplot(mtcars, aes(x = factor(cyl), group = factor(gear))) +
   geom_bar(position = position_dodge(width = 0.8), binwidth = 25) +
   xlab("Patient") +
   ylab("Number of Mutations per Patient Sample")

这会产生这样的结果:

每个条形图代表每个患者的样本。

我想通过使用颜色填充条形图来添加有关每个患者样本的其他信息(例如,每个患者样本中的不同类型的突变)。我在想我可以像这样指定填充参数:

ggplot(mtcars, aes(x = factor(cyl), group = factor(gear), fill = factor(vs))) +
   geom_bar(position = position_dodge(width = 0.8), binwidth = 25) +
   xlab("Patient") +
   ylab("Number of Mutations per Patient Sample")

但这不会为每个患者样本条形图生成“堆叠条形图”。我假设这是因为 position_dodge() 已设置。有没有办法解决这个问题?基本上,我想要的是:

ggplot(mtcars, aes(x = factor(cyl), fill = factor(vs))) +
   geom_bar() +
   xlab("Patient") +
   ylab("Number of Mutations per Patient Sample")

但是在我列出的第一个图中可以使用这些颜色。 ggplot2 可以吗?

【问题讨论】:

可能duplicate @aosmith 你是对的。除了我正在使用“组”参数之外,这几乎是同一个问题。但是列出的无法同时使用堆栈和闪避的问题适用于这两个问题。 【参考方案1】:

我认为构面是最接近您所寻找的内容的近似值:

ggplot(mtcars, aes(x = factor(gear), fill = factor(vs))) +
    geom_bar(position = position_dodge(width = 0.8), binwidth = 25) +
    xlab("Patient") +
    ylab("Number of Mutations per Patient Sample") +
    facet_wrap(~cyl)

我在 ggplot2 的问题跟踪器中没有找到任何相关内容。

【讨论】:

谢谢。看来你不能同时使用闪避和堆叠。所以这是解决问题的壁橱解决方案。 我在看这个,最后发现,例如:facet_wrap(~sample) 按我需要的方式按样本分组。谢谢!【参考方案2】:

如果我正确理解您的问题,您希望将 aes() 传递到您的 geom_bar 层。这将允许您通过填充美学。然后,您可以根据要显示数据的方式将条形设置为“闪避”或“填充”。

这里列出了一个简短的示例:

   ggplot(mtcars, aes(x = factor(cyl), fill = factor(vs))) +
      geom_bar(aes(fill = factor(vs)), position = "dodge", binwidth = 25) +
      xlab("Patient") +
      ylab("Number of Mutations per Patient Sample")

使用结果图:http://imgur.com/ApUJ4p2(抱歉 S/O 不允许我发布图片)

希望有帮助!

【讨论】:

谢谢。但这并不是我想要的。我希望它们是堆叠的条形图(即我发布的第二个图)。所以每个病人都有多个堆叠的条形图并排在一起。【参考方案3】:

我已经通过按我喜欢的顺序将多个 geom_cols 层叠在一起来解决这个问题几次。比如代码

    ggplot(data, aes(x=cert, y=pct, fill=Party, group=Treatment, shape=Treatment)) +
      geom_col(aes(x=cert, y=1), position=position_dodge(width=.9), fill="gray90") +
      geom_col(position=position_dodge(width=.9)) +
      scale_fill_manual(values=c("gray90", "gray60"))

允许我制作您正在寻找的功能而无需刻面。请注意我如何将背景层的 y 值设置为 1。要添加更多层,您可以将变量累加求和。

剧情图片:

【讨论】:

【参考方案4】:

我想,我在这篇文章中的回答将帮助您为每个患者构建带有多个堆叠垂直条的图表...

Layered axes in ggplot?

【讨论】:

这不是一个真正的答案,但它几乎看起来像这个问题的重复。

以上是关于ggplot2:geom_bar 与组,position_dodge 和填充的主要内容,如果未能解决你的问题,请参考以下文章

ggplot2:带有自定义 y 限制的 geom_bar

使用 ggplot2 将颜色列添加到 geom_bar 图

ggplot2:使用填充geom_bar指定颜色时缺少图例

在 R 中保持 geom_bar() ggplot2 的数据顺序

ggplot2 中带有 geom_bar() 的回归线

ggplot2:更改条形图中每个方面的颜色