代码之家  ›  专栏  ›  技术社区  ›  aaaaa

在for循环中以pdf格式保存两个绘图图形

  •  0
  • aaaaa  · 技术社区  · 6 年前

    我有多个图要保存为 .pdf 在R中使用 par(mfrow=c(1,2)) ,即每个图形(待保存)有2个由1行和2列处理的图。

    由于我的绘图总数相当高,我正在创建一个for循环的绘图。

    如何在for循环中将这些图形(每个图形有两个)保存为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 回复  |  直到 6 年前
        1
  •  2
  •   Mikko Marttila    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()
    }
    

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