在 for 循环中将 2 幅图保存为 pdf

aaa*_*aaa 2 plot for-loop r save

我有多个图要保存为.pdf文件,它们是通过使用在 R 中创建的par(mfrow=c(1,2)),即每个图(要保存)有 2 个图,由 1 行和 2 列组成。

由于我的绘图总数相当高,因此我使用 for 循环创建绘图。

如何在 for 循环中将图(每图 2 个图)保存为 pdf 文件?

这是同样的时髦代码:

## create data.frames
df_1 = data.frame(x = c(1:100), y = rnorm(100))
df_2 = data.frame(x = c(1:100), y = rnorm(100))
df_3 = data.frame(x = c(1:100), y = rnorm(100))
df_4 = data.frame(x = c(1:100), y = rnorm(100))

## create list of data.frames
df_lst = list(df_1, df_2, df_3, df_4)

## plot in for loop by 1 row and 2 cols
par(mar=c(3,3,1,0), mfrow=c(1,2))

for (i in 1:length(df_lst)) {
    barplot(df_lst[[i]]$y)
}
Run Code Online (Sandbox Code Playgroud)

假设我想用该pdf函数保存绘图。这是我尝试过的:

for (i in 1:length(df_lst)) {
    pdf(paste('my/directory/file_Name_', i, '.pdf', sep = ''), height = 6, width = 12)
    barplot(df_lst[[i]]$y)
    dev.off()
}
Run Code Online (Sandbox Code Playgroud)

我的解决方案显然是错误的,因为该pdf函数在每个循环中保存一个数字(即 4 而不是 2)。

有什么建议吗?谢谢

Mik*_*ila 6

听起来您可以在这里使用嵌套循环:您创建的每个文件的外部循环,以及您创建的每个多面板图形的内部循环。由于所有数据帧都存储在一维列表中,因此您需要跟踪正在绘制的列表的索引。

这是一种方法:

nrow <- 1
ncol <- 2
n_panels <- nrow * ncol
n_files <- length(df_lst) / n_panels

for (i in seq_len(n_files)) {
  file <- paste0("file_", i, ".pdf")

  pdf(file, height = 6, width = 12)
  # plot params need to be set for each device
  par(mar = c(3, 3, 1, 0), mfrow = c(nrow, ncol))

  for (j in seq_len(n_panels)) {
    idx <- (i - 1) * n_panels + j
    barplot(df_lst[[idx]]$y)
  }

  # updated to also add a legend
  legend("bottom", legend = "Bar", fill = "grey")

  dev.off()
}
Run Code Online (Sandbox Code Playgroud)

如果您只想要一个包含多个页面的文件,您所需要做的就是将调用移到pdf()原始循环之外,并将参数设置移到以下位置之后pdf()

pdf('my/directory/file_Name.pdf', height = 6, width = 12)
par(mar=c(3,3,1,0), mfrow=c(1,2))
for (i in 1:length(df_lst)) {
    barplot(df_lst[[i]]$y)
}
dev.off()
Run Code Online (Sandbox Code Playgroud)