Многократные диаграммы рассеяния с соответствующими линиями регрессии (и формула), используя петли в 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)

1 ответ

Решение

Как только вы позвоните 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 Вызываются между несколькими вызовами сюжета, а не после того, как все они сделаны.

Другие вопросы по тегам