在 R 中使用循环的具有相应回归线(和公式)的多个散点图



我知道大多数程序员会把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()中绘制所有图形的,以便在多个绘图调用之间调用ablineboxed.labels,而不是在它们全部完成之后调用。

最新更新