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