如何在R中的ggplot箱线图中添加垂直线

5

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

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 字段分组: enter image description here

我想要做两件事:

1)为了提高该图的清晰度,我想在各区块之间添加分隔符,即在POSsim v之间、在sim vC之间等处添加分隔符(见图中丑陋的红线)。我一直在试用geom_vline,但没有成功。或者,我想在区块之间添加空白间隔。

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

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

再试一遍,还是没有运气,情节完全没有改变。

你会建议做什么?


3
你应该尝试使用facet_grid和facet_wrap进行调整。如果你发布一个可重现的实例,我们更容易帮助你。 - Eric Fail
1
我想你的意思是“水平”线。此外,Eric是正确的:facet_wrapfacet_grid可能是解决这个问题最好的方法。 - smillig
3个回答

7
这对您有效吗?
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")

会得到类似这样的东西, bbb

6

没有人覆盖水平线路,所以我想添加它。不确定为什么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似乎会将它们放置在整数位置上。找出您想要在哪个箱子后面加入一条线(第n个),并将xintercept参数设置为n +0.5以获得该线。您可以根据自己的喜好更改粗细和颜色:只需在xintercept位之后添加size=widthcolour="name"
顺便说一下,不管在coord_flip()前面还是后面,geom_vline()似乎对我来说都有效。我觉得这很违反直觉。
我不确定bdemarest是否正确地认为您需要使用与类别名称匹配的名称。我认为问题在于您使用了scale_colour_manual(),如果您使用了aes(...,color = var),则会应用该方法,而您使用了fill = var。因此,您需要scale_fill_manual。基于上述内容,我们可以添加:
p <- p + scale_fill_manual(values=c("black","gray","white"))
p

请注意,我没有为颜色定义任何因素名称以匹配。我认为颜色仅根据它们的顺序应用于您的因子级别,但我可能是错误的。
以上所有内容的最终结果: cyl boxplot

有没有办法手动减小箱线图的宽度,使其看起来不那么“肥胖”? - baha-kev
1
@baha-kev:是的,尽管由于某些原因似乎没有记录?我能够使用 p + geom_boxplot(aes(填充=因子(cyl)), 宽度=0.5)+ coord_flip()。将0.5替换为您想要的任何内容。它在 stat_boxplot 中提到,但不在 geom_boxplot 中提到。 - Hendy

1

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

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

尝试使用facet_grid()来分离y轴类别。
facet_grid(factor(MY_CATEGORY) ~ ., drop=TRUE)

我不确定这会不会起作用,因为我没有你的数据来测试。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接