我必须通过循环创建一些图形。图形是多层的,每个面板有三个不同的层。 我试过这段代码
pdf('plot.pdf', width=14, height=7)
R <- dim(dataset)[1]
for (i in 1:R) {
par(mfrow=c(1,2))
par(mfg=c(1,1))
plot(...)
points(...)
polygon(...)
par(mfg=c(1,2)
plot(...)
points(...)
polygon(....)
}
dev.off()
但结果是单个图形(而不是每个循环的一个图形)完全覆盖。
图形
使用par
函数循环时是否存在问题?
编辑:这是一个可重复的示例。我尝试使用split.screen
,但结果是相同的单页pdf,带有重叠的图。
该问题似乎与pdf
函数本身有关,因为循环正确地完成了工作。
set.seed(123)
## create data
varA1 <- matrix(rnorm(60,5,1), nrow=3)
varA2 <- matrix(rnorm(60,5,1), nrow=3)
varB1 <- matrix(rnorm(80,20,10), nrow=4)
varB2 <- matrix(rnorm(80,30,20), nrow=4)
sitesA <- 1:nrow(varA1)
sitesB <- 1:nrow(varB1)
totsites <- 1:max(sitesA, sitesB)
## create pdf
pdf('prova.pdf', width=14, height=7)
for(i in totsites) { # the pdf should contain "totsites" number of pages (in this case, 4)
split.screen(c(1,2))
if(i %in% sitesA) {
screen(1)
plot(var1[i,], ylim=c(0, max(c(var1, var2))), col='darkred', type='b', pch=16)
points(var2[i,], col='red', type='b', pch=16)
polygon(c(1:20,rev(1:20)),c(var1[i,]-1,rev(var1[i,]+1)), col=rgb(100, 0, 0, maxColorValue=255, alpha=50), border=NA)
}
if(i %in% sitesB) {
screen(2)
plot(var3[i,], ylim=c(0, max(c(var3, var4))), col='darkgreen', type='b', pch=16)
points(var4[i,], col='green', type='b', pch=16)
polygon(c(1:20,rev(1:20)),c(var3[i,]-10,rev(var3[i,]+10)), col=rgb(0, 100, 0, maxColorValue=255, alpha=50), border=NA)
}
}
dev.off()
顺便说一下,我收到了这个警告
Warning message:
In par(new = TRUE) : calling par(new=TRUE) with no plot
答案 0 :(得分:0)
使用layout()
而不是split.screen()
似乎是更好的选择。还要把它放在循环之外。
pdf('prova.pdf', width=14, height=7)
layout(matrix(1:2, nrow=1))
for(i in totsites) { # the pdf should contain "totsites" number of pages (in this case, 4)
if(i %in% sitesA) {
plot(varA1[i,], ylim=c(0, max(c(varA1, varA2))), col='darkred', type='b', pch=16)
points(varA2[i,], col='red', type='b', pch=16)
polygon(c(1:20,rev(1:20)),c(varA1[i,]-1,rev(varA1[i,]+1)), col=rgb(100, 0, 0, maxColorValue=255, alpha=50), border=NA)
} else {
plot.new()
}
if(i %in% sitesB) {
plot(varB1[i,], ylim=c(0, max(c(varB1, varB2))), col='darkgreen', type='b', pch=16)
points(varB2[i,], col='green', type='b', pch=16)
polygon(c(1:20,rev(1:20)),c(varB1[i,]-10,rev(varB1[i,]+10)), col=rgb(0, 100, 0, maxColorValue=255, alpha=50), border=NA)
} else {
plot.new()
}
}
dev.off()