首页 > 解决方案 > 使用 plot 和 mfrow 函数在 r 中保存多个图

问题描述

我有以下问题。假设我们有 9 列相同的数据帧 Q 和时间向量 t。我想针对时间绘制 Q 的每一列,即

plot(t,Q[,1])
plot(t,Q[,2])
...
plot(t,Q[,9])

我想将它们分成 4 个子图,即在第一个图中我有 Q[,1]-Q[,4],在第二个图中有 Q[,5]-Q[,8] 和 Q[,9]最后一个。最后,我想通过使用循环保存这 3 个图。

到目前为止我的工作

par(mfrow=c(1,4)))
for (i in 1:length(Q)){
plot(Q[,1],Q[,i])
png(print(paste(i,".png")))
  dev.off()
  }

但它只保存了所有 9 张图,我不知道如何编写一个只保存我想要的 3 张图像的循环。

标签: r

解决方案


假设您的数据看起来像这样,t您的第一列和接下来的 9 列中的变量(从您问题的第二部分看起来很可能)

set.seed(69)
Q <- data.frame(t = 1:10, replicate(9, cumsum(runif(10))))

如果我们希望每四个新图像都有一个新的 PNG,我们需要告诉 R。首先,我们只想从第 2 列迭代到最后一列(因为我们的第一列是t),所以我们需要for(i in 2:length(Q)).

我们还需要跟踪何时绘制新图。这应该是每 4 个图,所以我们需要调用pngwhen iis 2、6 和 10。我们可以使用模运算符%%来解决这个问题:我们开始一个新的 png i %% 4 == 2。同样,我们希望在到达最后一列时或何时dev.off()保存绘图。i %% 4 == 1每当您打开新设备时,记住par()都会重置,因此我们必须par(mfrow = c(2, 2))在每次调用后执行png

所以代码看起来像这样:

for(i in 2:length(Q))
{
  if(i %% 4 == 2) {
    png(paste0("plots_", i - 1, "_to_", i + 2, ".png"))
    par(mfrow = c(2, 2))
  }
  plot(Q[[1]], Q[[i]], type= "l", xlab = "time", ylab = paste("Variable", i - 1))
  if(i %% 4 == 1 | i == length(Q)) dev.off()
}

现在,当我检查我的 R 主目录时,我发现以下四个文件:


plots_1_to_4.png


在此处输入图像描述


plots_5_to_8.png


在此处输入图像描述


plots_9_to_12.png

在此处输入图像描述


推荐阅读