更新:从R wiki获取的内容已经失效,原链接为http://rwiki.sciviews.org/doku.php?id=tips:graphics-base:2yaxes,但现在已无法访问。可以通过wayback machine查看。
同一图上绘制两种不同的y轴
请注意,在很少情况下使用同一图上的两个不同的刻度是合适的,因为这容易误导图形的观察者。可参考以下两个例子和对此问题的评论:example1,example2(来自Junk Charts),以及Stephen Few的文章(其中指出:“我当然不能最终得出这样的结论:带有双刻度轴的图表从未有用过,只是在我考虑到其他更好的解决方案时,我无法想到需要它们的情况。”)。还可以参见这个漫画中的第4点...
如果您仍然坚持要绘制同一图上的两种不同y轴,基本方法是先创建第一个图并设置par(new=TRUE)
以防止R清除图形设备;创建第二个图时使用axes=FALSE
(并将xlab
和ylab
设置为空,也可以使用ann=FALSE
),再使用axis(side=4)
在右侧添加新轴,使用mtext(...,side=4)
在右侧添加轴标签。以下是使用一些虚构数据的示例:
set.seed(101)
x <- 1:10
y <- rnorm(10)
z <- runif(10, min=1000, max=10000)
par(mar = c(5, 4, 4, 4) + 0.3)
plot(x, y)
par(new = TRUE)
plot(x, z, type = "l", axes = FALSE, bty = "n", xlab = "", ylab = "")
axis(side=4, at = pretty(range(z)))
mtext("z", side=4, line=3)
plotrix
包中的twoord.plot()
函数和latticeExtra
包中的doubleYScale()
函数可以自动化这个过程。
另一个例子(摘自Robert W. Baer在R邮件列表上的帖子):
time <- seq(0,72,12)
betagal.abs <- c(0.05,0.18,0.25,0.31,0.32,0.34,0.35)
cell.density <- c(0,1000,2000,3000,4000,5000,6000)
par(mar=c(5, 4, 4, 6) + 0.1)
plot(time, betagal.abs, pch=16, axes=FALSE, ylim=c(0,1), xlab="", ylab="",
type="b",col="black", main="Mike's test data")
axis(2, ylim=c(0,1),col="black",las=1)
mtext("Beta Gal Absorbance",side=2,line=2.5)
box()
par(new=TRUE)
plot(time, cell.density, pch=15, xlab="", ylab="", ylim=c(0,7000),
axes=FALSE, type="b", col="red")
mtext("Cell Density",side=4,col="red",line=4)
axis(4, ylim=c(0,7000), col="red",col.axis="red",las=1)
axis(1,pretty(range(time),10))
mtext("Time (Hours)",side=1,col="black",line=2.5)
legend("topleft",legend=c("Beta Gal","Cell Density"),
text.col=c("black","red"),pch=c(16,15),col=c("black","red"))
类似的方法可以用于将不同类型的图表叠加在一起,如条形图、直方图等。
ggplot2
的答案和讨论:https://dev59.com/V3A75IYBdhLWcg3wy8br(在SO上搜索“[r] two y-axes”或“[r] twoord.plot”)——虽然有一些其他相关的答案,但(令我惊讶的是,因为这是一个R常见问题解答)没有完全相同的东西。 - Ben Bolker