我知道大多数程序员会把R的"LATTICE"或"ggplot2"包称为这个问题的解决方案,但必须有一种方法来使用基本包。我想用简单的循环绘制多个具有相应回归线和相关系数的图。一个简单的示例数据可能看起来像-
a=list(cbind(c(1,2,3), c(4,8,12)), cbind(c(5,15,25), c(10,30,50)))
par(mfrow=c(1,2))
lapply(1:length(a), function(i)
plot(a[[i]][,1], a[[i]][,2]))
lapply(1:length(a), function(i)
abline(lm(a[[i]][,2]~a[[i]][,1])))
require(plotrix)
lapply(1:length(a), function(i)
boxed.labels(a[[i]][,1][1], a[[i]][,2][3],
labels=paste(round(cor(a[[i]][,2], a[[i]][,1], use = "pairwise.complete.obs"),2)),
border=FALSE, adj=0.5, cex=0.8))
如果您运行上面的脚本,您会注意到所有线性线和r值都将绘制在最后一个图形的顶部。有什么方法可以在调用回归的同时编写plot命令吗?或者有其他巧妙的方法来处理循环,在相应的数字上绘制回归图??它适用于单个情节(如下所示),但我正在处理一个相当大的列表!
plot(a[[1]][,1], a[[1]][,2])
abline(lm(a[[1]][,2]~a[[1]][,1]))
boxed.labels(a[[1]][,1][1], a[[1]][,2][3],
labels=paste(round(cor(a[[1]][,2], a[[1]][,1], use = "pairwise.complete.obs"),2)),
border=FALSE, adj=0.5, cex=0.8)
一旦调用plot()
,就开始在新的"单元格"中绘图。因此,如果您想在进入下一个之前向绘图添加更多内容,请确保在调用下一个plot()
之前完成所有绘图
例如
a=list(cbind(c(1,2,3), c(4,8,12)), cbind(c(5,15,25), c(10,30,50)))
par(mfrow=c(1,2))
lapply(a, function(d) {
d <- setNames(data.frame(d), c("x","y"))
plot( y~x, d )
abline( lm( y ~ x, d ) )
boxed.labels(min(d$x), max(d$y),
labels=paste(round(cor(d$y, d$x, use = "pairwise.complete.obs"),2)),
border=FALSE, adj=0.5, cex=0.8)
})
请注意,我们是如何在单个lapply()
中绘制所有图形的,以便在多个绘图调用之间调用abline
和boxed.labels
,而不是在它们全部完成之后调用。