在Base R绘图的单个箱图中添加水平“分隔”线

时间:2020-08-13 02:12:04

标签: r boxplot

我需要在Base R箱线图中添加“分隔线”以分隔差异组。在下面的示例中,我想使用水平线(红色)分隔A和B组(每个组具有2个级别)。 R代码可再现的结果:

dat = data.frame(A1 = rnorm(1000, 0, 1), A2 = rnorm(1000, 1, 2),
                 B1 = rnorm(1000, 0.5, 0.5), B2 = rnorm(1000, 1.5, 1.5))
boxplot(dat, horizontal = T, outline=F)

enter image description here

在Base R中有一种简单的方法吗?

还有,是否有一种简单的方法可以为y轴标签着色?我希望轴上的A1和B1显示为红色,而A2和B2显示为蓝色。

谢谢!

1 个答案:

答案 0 :(得分:1)

使用abline。要获得正确的位置,请使用y轴axTicks的平均值。

要获取彩色标签,请先省略yaxt并使用axis重建mtext的刻度和axTicks

b <- boxplot(dat, horizontal=T, outline=F, yaxt="n")
ats <- axTicks(2)
axis(2, labels=F)
mtext(b$names, 2, 1, col=c(2, 4), at=ats)
abline(h=mean(ats), lwd=2, col=2)

enter image description here

如果要使轴刻度标签颜色与标签相对应,请改用segments

b <- boxplot(dat, horizontal=T, outline=F, yaxt="n")
ats <- axTicks(2)
abline(h=mean(ats), lwd=2, col=2)
pu <- par()$usr
Map(function(x, y) segments(pu[1] - .2, x, pu[1], x, xpd=T, col=y), ats, c(2, 4))
mtext(b$names, 2, 1, col=c(2, 4), at=ats)

enter image description here

编辑:要进一步调整空间,请使用at=中的boxplot选项,而忽略中间的axTicks

b <- boxplot(dat, horizontal=T, outline=F, yaxt="n", at=c(1, 2, 4, 5))
ats <- axTicks(2)[-3]
abline(h=mean(ats), lwd=2, col=2)
pu <- par()$usr
Map(function(x, y) segments(pu[1] - .2, x, pu[1], x, xpd=T, col=y), ats, c(2, 4))
mtext(b$names, 2, 1, col=c(2, 4), at=ats)

enter image description here