r - 将多个 ggplot2 图保存为列表中的 R 对象并在网格中重新显示

标签 r ggplot2 plot r-grid

我想在大型 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”

在此线程中 Saving grid.arrange() plot to file 他们讨论了一个使用 arrangeGrob() 的解决方案

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

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

我被迫使用 recordPlot() 而不是保存到列表中,因为这在保存时不会生成与立即绘制时相同的图形,很遗憾,我无法复制,抱歉。

在我的实际代码中,我正在执行一个大型 for 循环,遍历多个变量,与每个变量建立关联并绘制散点图,其中我根据它们的有效位来命名散点图。然后我想在动态 knitr 报告中重新显示网格中重要的图。

我知道我可以在 for 循环之后重新绘制重要的图而不是保存它们(我也无法在执行 knitr 时另存为 png)。不过,我想找到一种方法将绘图动态保存为 R 对象,然后在网格中重新绘制它们。

感谢阅读

“R 版本 3.2.1” Windows 7 64 位 - 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.
    ))

如果您真的对网格排列有强制症,并且您没有太多要发布的网格,则您可能想要采用手动方法。否则,当您执行 grid.arrange 时,您需要在那里执行所有规范(调整字体、增加轴标签大小、自定义颜色等),然后相应地调整宽度和高度。

关于r - 将多个 ggplot2 图保存为列表中的 R 对象并在网格中重新显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31947727/

相关文章:

R:对数尺度的图像强度

python - 如何使 mplcursors 模块仅显示折线图上绘制的点的标签

r - 在 R 中的神经网络中使用两个不同的 sigmoid 函数

r - data.table 用子字符串替换列

r - 在geom_sf_text中,如何在美学上微调x和y?

r - 使用specaccum绘制R中一个位点的物种积累曲线

r - 使用 ggplot2、R 在圆形图上绘制因子的非重叠水平

r - 用于比较向量的用户定义的 R 函数

r - 如何重新排序具有特定因子顺序的 ggplot 对象

r - facet_wrap : mark (color border, 行和标题)一个特定的情节