R将多个ggplot2图作为R保存

我想在一个大的for循环中将多个图(使用ggplot2)保存到列表中。 然后随后在网格中显示图像(使用grid.arrange)

我已经尝试了两种解决方案:1将它存储在列表中,如下所示:

pltlist[["qplot"]] <- qplot 

但是由于某些原因,这确实可以保存绘图。 所以我诉诸第二个策略是recordPlot()这能够正确保存图,但无法在网格中使用它。

可再生的例子:

require(ggplot2);require(grid);require(gridExtra)
df  <- data.frame(x = rnorm(100),y = rnorm(100))
histoplot <- ggplot(df, aes(x=x)) + geom_histogram(aes(y=..density..),binwidth=.1,colour="black", fill="white") 
qplot <- qplot(sample = df$y, stat="qq") 



pltlist <- list()
pltlist[["qplot"]] <- qplot
pltlist[["histoplot"]] <- histoplot
grid.arrange(pltlist[["qplot"]],pltlist[["histoplot"]], ncol=2) 

上面的代码工作,但在我的实际代码中产生错误的图形

然后我尝试了recordPlot()

print(histoplot)
c1 <- recordPlot()
print(qplot)
c2 <- recordPlot()

我能够单独显示所有图,但grid.arrange会产生一个错误:

grid.arrange(replayPlot(c1),replayPlot(c2), ncol=2) # = Error

gList中的错误(list(wrapvp = list(x = 0.5,y = 0.5,width = 1,height = 1,仅在'gList'中允许'grobs'

在这个线程中将grid.arrange()绘图保存到文件他们制定了一个使用arrangeGrob()代替的解决方案

arrangeGrob(c1, c1, ncol=2) # Error

vapply中的错误(x $ grobs,as.character,character(1)):值必须为长度1,但FUN(X [[1]])结果为长度3

我不得不使用recordPlot(),而不是保存到列表中,因为当它被保存为立即绘制时不会生成相同的图形,我不幸无法复制,对不起。

在我的实际代码中,我做了一个大的for循环,循环了几个变量,与每个变量进行关联,并绘制散点图,其中我根据它们的有意义级别命名散点图。 然后,我想在一个动态的针织报告中重新显示网格中重要的图。

我意识到我可以重新绘制在for循环之后重要的地块,而不是保存它们,(我在做knitr时也不能保存为png)。 不过,我想找到一种方法来动态地将绘图保存为R对象,然后在网格中重新绘制它们。

谢谢阅读

“R version 3.2.1”Windows 7 64bit - RStudio - 版本0.99.652附加的基本软件包:[1] grid grDevices datasets utils graphics stats methods base

其他附加软件包:[1] gridExtra_2.0.0 ggplot2_1.0.1


我可以想到两个解决方案。

1.如果您的目标是将绘图列表保存为R对象,我建议:

    saveRDS(object = pltlist, file = "file_path")

这样当你想在这些图表中重新加载时,你可以使用readRDS() 。 然后你可以把它们放在cowplotgridarrange 。 该命令适用于所有列表和R对象。

这种方法的一个警告是,如果ggplot2的设置/标签取决于环境中的东西(不是数据,而是像点大小,形状或着色设置等)而不是用于生成图形的ggplot2函数),那么您的直到你还原你的依赖关系,图表才会起作用。 保存一些依赖关系的一个原因是模块化你的脚本来制作图表。

另一个需要注意的是性能:根据我的经验,当您有大量图形(100多个图形)时,我发现读取数据和重新制作单个图形比读取所有图形的RDS文件更快。

2.如果您的目标是保存每个图形的“图像”或“图片”(单个和/或多图形为.png,.jpeg等) ,然后在R之外手动调整网格中的内容,例如Powerpoint或者photoshop,我建议:

    filenames <- c("Filename_1", "Filename_2") #actual file names you want... 
    lapply(seq_along(pltlist), function(i) {
      ggsave(filename = filenames[i], plot = pltlist[[i]], ...) #use your settings here
    })

我喜欢单个图的设置:

    lapply(seq_along(pltlist), function(i) ggsave(
      plot = pltlist[[i]], 
      filename = paste0("plot_", i, "_", ".tiff"), #you can even paste in pltlist[[i]]$labels$title
      device = "tiff", width=180, height=180, units="mm", dpi=300, compression = "lzw", #compression for tiff
      path = paste0("../Blabla") #must be an existing directory.
    ))

如果您真的关于电网安排的OCD,并且您没有太多可用于出版物的信息,您可能需要采取手动方法。 否则,当你做grid.arrange时,你会想做所有的规格(调整字体,增加轴标签大小,自定义颜色等),然后相应地调整宽度和高度。

链接地址: http://www.djcxy.com/p/5219.html

上一篇: R saving multiple ggplot2 plots as R

下一篇: use ggpairs to create this plot