r - 使用 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 张图像的循环。
解决方案
假设您的数据看起来像这样,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 个图,所以我们需要调用png
when i
is 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
推荐阅读
- xml - XSLT 如何获取特定的组节点
- airflow - 从 TriggerDagRunOperator 触发任务
- reactjs - 在 web 应用程序中存储和管理新颖长度文本的最佳方法是什么?
- sql - 连接表上的 SQL 最小值
- java - 如何将背景图像放入 JFrame 中?
- python - 推理过程中“列出超出范围错误的索引”(本周出现)
- java - 为什么数据没有在数据库中插入代码中的任何错误
- http - 即使强制尝试设置为 false,Go http 请求也会退回到 http2
- java - 将数据保存到文本文件中
- ibm-cloud-functions - 我可以将 Cloud Functions 操作的执行时间延长到一个半小时吗?