在 for 循环中以 pdf 格式保存 2-plot 图形

Posted

技术标签:

【中文标题】在 for 循环中以 pdf 格式保存 2-plot 图形【英文标题】:Save 2-plot figures in pdf within for loop 【发布时间】:2018-07-19 12:22:44 【问题描述】:

我有多个绘图要保存为 .pdf 文件,它们是使用 par(mfrow=c(1,2)) 在 R 中创建的,即每个图(要保存)有 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)

假设我想使用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()

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

有什么建议吗? 谢谢

【问题讨论】:

所以澄清一下,你想要 1 个文件 2 页,每页 2 个数字,还是 2 个文件,1 页,2 个数字? 嗨,谢谢。 2 个 pdf 文件,每个文件有 2 个图。但如果你也可以发布你的第二个解决方案,那就太好了:) 【参考方案1】:

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

这是一种方法:

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()

如果您只想要一个包含多个页面的文件,您只需将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()

【讨论】:

谢谢。如果我需要为每个面板添加一个图例(由两个图组成)怎么办?你可以添加一个简短的sn-p吗?谢谢 @aaaaa 如果您有单独的文件,这很简单:只需在面板循环之后但调用dev.off() 之前添加它(请参阅编辑后的帖子)。对于单个文件,您必须再次计数以查看何时添加它。

以上是关于在 for 循环中以 pdf 格式保存 2-plot 图形的主要内容,如果未能解决你的问题,请参考以下文章

从 Expo 的缓存中以 base64 格式读取文件,写入 Firebase 存储(Cloud Storage for Firebase)

对于表中的行,将行保存在临时表中以在 plpgsql 的选择查询中使用其数据

在 AngularJS 中以 CSV、Excel、PDF 格式导出数据

在 PDF 报告中以 2014 年 1 月 12 日 12:10 格式显示日期时出现问题

在“for”循环中以 1 递增时,是不是有使用 > (<) 而不是 != 的技术原因?

在drupal中以表格或网格格式显示列表