使用不同的Y刻度将箱形图与点图合并

时间:2014-07-03 13:11:21

标签: r plot overlay visualization boxplot

我正在尝试生成一个由箱形图组成的图形,其中一组点叠加在箱线图上。关键问题是箱形图的y尺度与点的y尺度不同。 (是的,这是非常差的可视化 - 但我不是该论文的主要作者)。我已经能够生成具有不同y刻度的绘图,但是我遇到了x轴的问题。

使用以下代码

boxdata <- data.frame(fc=runif(100, min=-4, max=4),
                      sym=sample(c('A', 'B', 'C', 'D', 'E'), 100, replace=TRUE))
par(mar=c(5, 4, 1, 6) + 0.1)
junk <- boxplot(fc ~ sym, boxdata, las=2, pch=19, ylim=c(-5,5),
                varwidth=FALSE, xaxt='n')
mtext("Y-axis",side=2,line=2.5)
axis(1, at=1:5, labels=sort(unique(boxdata$sym)), las=2)

par(new=TRUE)
x <- 1:5
y <- runif(5, min=-1, max=1)
plot(x,y, col='red', type='p', pch=15, axes=FALSE, ylim=c(-1,1), cex=1.5)
axis(4, ylim=c(-1,1), las=1)

我得到了下图。如您所见,红色点与X轴标签(或框中心)不对齐。盒子中心位于1:5,所以我认为用x = 1:5调用plot()应该排成一行。

有人能指出我用盒子中心排列第二组点的方法吗?

编辑:如果我在不同的y刻度上绘制两组点

,则不会出现此问题
plot(1:10, runif(10) , col='red', pch=19)
par(new=TRUE)
plot(1:10, runif(10, min=5, max=20), col='blue', pch=19, axes=FALSE)
axis(4, las=2)

1 个答案:

答案 0 :(得分:1)

请勿使用par(new=TRUE),但请使用points代替第二个plot命令:

boxdata <- data.frame(fc=runif(100, min=-4, max=4),
                      sym=sample(c('A', 'B', 'C', 'D', 'E'), 100, replace=TRUE))
par(mar=c(5, 4, 1, 6) + 0.1)
junk <- boxplot(fc ~ sym, boxdata, las=2, pch=19, ylim=c(-5,5),
                varwidth=FALSE, xaxt='n')
mtext("Y-axis",side=2,line=2.5)
axis(1, at=1:5, labels=sort(unique(boxdata$sym)), las=2)

x <- 1:5
y <- runif(5, min=-1, max=1)

points(x, 4*y, col='red', type='p', pch=15, ylim=c(-1,1), cex=1.5)
axis(4, at=seq(-4, 4, by=2),  label=seq(-1, 1, by=.5), las=1)

编辑:查看?bxp帮助页面。您会发现xlim默认为range(at, *) + c(-0.5, 0.5)的备注。因此,您可以为第二个图表指定相同的内容:

junk <- boxplot(fc ~ sym, boxdata, las=2, pch=19, ylim=c(-5,5),
                varwidth=FALSE, xaxt='n')
mtext("Y-axis",side=2,line=2.5)
axis(1, at=1:5, labels=sort(unique(boxdata$sym)), las=2)
par(new=TRUE)
plot(x,y, col='red', type='p', pch=15, axes=FALSE, ylim=c(-1,1), cex=1.5, 
     xlim=range(x) + c(-0.5, 0.5)) 
axis(4, ylim=c(-1,1), las=1)