【问题标题】:How to add vertical lines to ggplot boxplots in R如何在 R 中向 ggplot 箱线图添加垂直线
【发布时间】:2012-06-28 06:26:49
【问题描述】:

我正在根据这些数据绘制箱线图:

MY_LABEL     MY_REAL     MY_CATEGORY
1 [POS]       .56            POS
1 [POS]       .57            POS
1 [POS]       .37            POS
2 [POS]       .51            POS
1 [sim v]     .65            sim v
...

我正在使用 ggplot2:

ggplot( data=myDF, aes( x=MY_LABEL, y=MY_REAL, fill=MY_CATEGORY ) ) +
    scale_colour_manual( values=palette ) +
    coord_flip() + 
    geom_boxplot( outlier.size = 0 )

这很好用,并按字段 MY_CATEGORY 对箱线图进行分组:

我想做两件事:

1)为了提高这个情节的清晰度,我想在各个块之间添加分隔符,即在POSsim v之间,在sim vC之间等(见丑陋的红色图中的线条)。 我一直在与geom_vline 苦苦挣扎,但没有运气。 或者,我想在块之间添加空格。

2) 如果我以灰度打印此图,则无法区分不同的块。我正在尝试使用以下方法强制使用不同的调色板:

scale_colour_manual( values=c("black","darkgray","gray","white") )

再一次,运气不好,情节根本没有改变。

你会建议做什么?

【问题讨论】:

  • 您应该尝试使用 facet_grid 和 facet_wrap。如果您发布可复制的内容,我们更容易为您提供帮助。
  • 我认为您的意思是“水平”线。另外,Eric 是对的:facet_wrapfacet_grid 可能是最好的解决方案。

标签: r colors ggplot2 line boxplot


【解决方案1】:

这对你有用吗?

require(ggplot2)
mtcars$cyl2<- ifelse(mtcars$cyl > 4, c('A'), c('B')) 
p <- ggplot(mtcars, aes(factor(cyl), mpg))
p + geom_boxplot() + facet_grid(. ~ cyl2, scales = "free", space = "free")

会给这样的东西,

【讨论】:

    【解决方案2】:

    要更改填充颜色,您需要一个命名的值向量。名称需要与 y 轴类别名称完全匹配。

    scale_fill_manual(values=c("POS"="black", "sim v"="gray50",
                               "C"="gray80", "sim t"="white"))
    

    要分隔 y 轴类别,请尝试 facet_grid()

    facet_grid(factor(MY_CATEGORY) ~ ., drop=TRUE)
    

    我不确定这是否可行,因为我没有你的数据来测试它。

    【讨论】:

      【解决方案3】:

      没有人覆盖水平线路线,所以我想我会添加它。不知道为什么geom_vline() 不适合你。这是我所做的(选择使用 Eric Fail 的方法):

      require(ggplot2)
      p <- ggplot(mtcars, aes(factor(cyl), mpg))
      p <- p + geom_boxplot(aes(fill=factor(cyl))) + coord_flip()
      p <- p + geom_vline(xintercept=c(1.5,2.5))
      p
      

      这里只有三个箱线图,但在玩耍时,ggplot 似乎将它们放置在整数位置。只需找出您想要在 (nth) 之后的一行并将 xintercept 参数放在 n+0.5 的行。您显然可以根据自己的喜好更改粗细和颜色:只需在 xintercept 位后添加 size=widthcolour="name"

      顺便说一句,geom_vline() 似乎对我有用,无论它是在 coord_flip() 之前还是之后。我觉得这违反直觉。


      我不确定 bdemarest 是否正确,您需要名称来匹配类别名称。我认为问题在于您使用了scale_colour_manual(),这适用于您使用aes(..., colour=var) 而您使用fill=var 的情况。因此,您需要scale_fill_manual。在上述基础上,我们可以添加:

      p <- p + scale_fill_manual(values=c("black","gray","white"))
      p
      

      请注意,我没有为要匹配的颜色定义任何因素名称。我认为颜色只是根据它们的顺序应用于您的因子水平,但我可能是错的。


      以上所有的最终结果:

      【讨论】:

      • 有没有办法手动减小箱线图的宽度,让它们看起来不那么“胖”?
      • @baha-kev:是的,尽管出于某种原因,它似乎没有记录在案?我能够做到p + geom_boxplot(aes(fill=factor(cyl)), width=0.5) + coord_flip()。用你想要的任何东西替换 0.5。 stat_boxplot 提到了它,但 geom_boxplot 没有提到。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-05-05
      • 1970-01-01
      • 1970-01-01
      • 2021-09-22
      • 2014-08-23
      • 2020-08-09
      • 1970-01-01
      相关资源
      最近更新 更多