【问题标题】:Saving multiple ggplots from ls into one and separate files in R将 ls 中的多个 ggplots 保存到 R 中的一个单独文件中
【发布时间】:2013-12-28 08:06:48
【问题描述】:

我的 ls 上有几个 ggplots 作为对象。我想将它们保存为单独的文件(尽管我也想知道如何将它们全部保存在 1 个大文件中)。我读过这个:questionquestion,但我似乎无法调整代码。我还尝试按照here 的建议将它们全部绘制在一个大文件中,但确实会出现此错误:Error in do.call("grid.arrange", plots2[[i]]) : second argument must be a list。在将所有 ggplots 放在一个列表中时,我缺少一些东西。

这是我迄今为止尝试过的:

> ls() #List of objects on my ls. All the p* are my ggplots that I want to save.
[1] "all"     "dat"     "dat2"    "dat3"    "data"    "dlook"   "dlook2"  "dlook3"  "i"       "look2"   "mdfx"   
[12] "objects" "order"   "p"       "p1"      "p10"     "p11"     "p12"     "p13"     "p14"     "p15"     "p16"    
[23] "p17"     "p18"     "p19"     "p2"      "p3"      "p4"      "p5"      "p6"      "p7"      "p8"      "p9"    

> objects<-ls()
> plot<-objects[14:30]
> plots
 [1] "p1"  "p10" "p11" "p12" "p13" "p14" "p15" "p16" "p17" "p18" "p19" "p2"  "p3"  "p4"  "p5"  "p6"  "p7"  "p8"  "p9" 

> class(plots)
[1] "character"

plots2<-as.list(plots)#Transform into a list. 

library(gridExtra) #Code suggested to create one pdf file.
pdf("test.pdf", onefile = TRUE)
for (i in seq(length(plots2))) {
  do.call("grid.arrange", plots2[[i]])  
}
dev.off()

【问题讨论】:

  • 您指向第二个问题的链接与第一个问题相同。另外,您是要在 pdf 的每页上打印一个图,还是将它们一起排列在一页上?
  • 抱歉,这将解决此问题。我想知道如何做这两个选项 1)单独的 pdf 和 2)都在一个大 pdf 中,每页一个情节。
  • 此时,您可能需要mget(另请注意ls 将允许您使用正则表达式查找项目)。但首先将所有地块放在一个预先分配的列表中可能会更简单(也更干净)。
  • @joran 你能告诉我如何制作清单和分配我的地块吗?或者推荐任何链接/阅读资料?
  • @GodinA 一旦你阅读了mget 并尝试过,你需要完全放弃 for 循环。 do.call 的重点是你把函数 grid.arrange 和整个 ggplot 对象列表交给它,剩下的事情就交给它了。

标签: r image ggplot2 save


【解决方案1】:

最好将你的地块列在一个列表中

l = mget(plots)

然后你可以简单地逐页打印,

pdf("all.pdf")
invisible(lapply(l, print))
dev.off()

或每个文件保存一个图,

invisible(mapply(ggsave, file=paste0("plot-", names(l), ".pdf"), plot=l))

或将它们全部排列在一页中,

   # On Windows, need to specify device
    ggsave("arrange.pdf", arrangeGrob(grobs = l), device = "pdf")

或将它们 2x2 排列在多个页面中,

  # need to specify device on Windows 
    ggsave("arrange2x2.pdf", marrangeGrob(grobs = l, nrow=2, ncol=2),
device = "pdf")

等等

(未经测试)

【讨论】:

  • 这很有帮助 - 当我尝试使用自己的示例时,它会生成一个空白页面。知道为什么会发生这种情况吗?
【解决方案2】:

请注意,您不必使用 lapply。 假设您有一个包含所有图的列表:

MyPlots = list(plot1, plot2, plot3)

只需使用:

pdf("all.pdf")
MyPlots
dev.off()

【讨论】:

    【解决方案3】:

    如果地块p1p10等已经存在,并且您希望它们保存为p1.pdf等,那么我认为应该这样做:

    lapply(plots,function(x){ggsave(file=paste(x,"pdf",sep="."),get(x))})
    

    ggsave(...) 有许多参数用于指定输出文件的尺寸和格式。

    【讨论】:

      【解决方案4】:

      作为充实 Joran 评论的示例,以及对 Baptiste 回答的补充,这就是您如何初始化列表并将图预先存储在列表中:

      plots <- list()
      plots[[1]] <- ggplot(...) # code for p1
      plots[[2]] <- ggplot(...) # code for p2
      
      ## Depending on if your plots are scriptable, you could use a loop
      
      for (i in 3:10) {
          plots[[i]] <- ggplot(...) # code for plot i
      }
      

      那么这个列表,plots,对应于 baptiste 的回答中的l

      使用列表时,单括号[ 用于子列表,您必须使用双括号[[ 来获取列表的元素。例如,plots[[1]] 会给你ggplot 对象,它是plots 的第一个元素,但plots[1] 会给你一个包含第一个图作为元素的长度列表。起初这可能看起来令人困惑,但这是有道理的,特别是如果您只想绘制前三个图,那么您可以在 baptiste 的任何示例中使用 myplots[1:3] 而不是 l。 (详情请参阅?"["。)

      每当您发现自己用数字顺序命名变量时,例如x1x2x3,这表明您应该改用列表。

      【讨论】:

        猜你喜欢
        • 2014-12-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-30
        相关资源
        最近更新 更多