将 grid.arrange() 绘图保存到文件

Posted

技术标签:

【中文标题】将 grid.arrange() 绘图保存到文件【英文标题】:Saving grid.arrange() plot to file 【发布时间】:2013-06-08 04:30:13 【问题描述】:

我正在尝试使用ggplot2 绘制多个图,并使用grid.arrange() 排列它们。 由于我设法找到了描述我遇到的确切问题的人,因此我引用了link的问题描述:

当我在grid.arrange() 之后使用ggsave() 时,即

grid.arrange(sgcir1,sgcir2,sgcir3,ncol=2,nrow=2)
ggsave("sgcirNIR.jpg")

我不保存网格图,而是最后一个单独的 ggplot。有没有 使用grid.arrange() 实际保存绘图的方式 ggsave() 或类似的东西? 除了使用旧的方式

jpeg("sgcirNIR.jpg")
grid.arrange(sgcir1,sgcir2,sgcir3,ncol=2,nrow=2)
dev.off()

相同的链接给出了以下解决方案:

require(grid)
require(gridExtra)
p <- arrangeGrob(qplot(1,1), textGrob("test"))
grid.draw(p) # interactive device
ggsave("saving.pdf", p) # need to specify what to save explicitly

但是,我不知道如何使用ggsave()grid.arrange() 调用的输出保存在以下代码中,该代码取自link:

library(ggplot2)
library(gridExtra)
dsamp <- diamonds[sample(nrow(diamonds), 1000), ] 

p1 <- qplot(carat, price, data=dsamp, colour=clarity)
p2 <- qplot(carat, price, data=dsamp, colour=clarity, geom="path")

g_legend<-function(a.gplot)
tmp <- ggplot_gtable(ggplot_build(a.gplot))
leg <- which(sapply(tmp$grobs, function(x) x$name) == "guide-box")
legend <- tmp$grobs[[leg]]
return(legend)

legend <- g_legend(p1)
lwidth <- sum(legend$width)

## using grid.arrange for convenience
## could also manually push viewports
grid.arrange(arrangeGrob(p1 + theme(legend.position="none"),
                                        p2 + theme(legend.position="none"),
                                        main ="this is a title",
                                        left = "This is my global Y-axis title"), legend, 
                     widths=unit.c(unit(1, "npc") - lwidth, lwidth), nrow=1)

# What code to put here to save output of grid.arrange()?

【问题讨论】:

使用png(); grid.arrange(); ggplot(); ggplot(); dev.off() 不是print(ggplot())? @DWin 是的,可能! :-) @Andrie 你的建议可行,但图像的分辨率非常低。当我使用ggsave() 保存单个ggplot 时,图像的分辨率要高得多。有没有办法以高分辨率保存grid.arrange() 的输出,就像用ggsave() 保存的单个图一样?如果我提供例如选项png(...,height=1600, width=2500),图像看起来很模糊。 【参考方案1】:

grid.arrange 直接在设备上绘图。另一方面,arrangeGrob 不绘制任何内容,而是返回一个 grob g,您可以将其传递给 ggsave(file="whatever.pdf", g)

它与 ggplot 对象的工作方式不同的原因,默认情况下,如果未指定,最后一个图将被保存,是 ggplot2 无形地跟踪最新的图,我不认为grid.arrange 应该搞砸这个包专用的柜台。

【讨论】:

当我尝试这个时,我得到一个错误,告诉我 g 不是正确的类型? @JackAidley 提出一个新问题,提供最少的自包含可重现示例,以及您的 sessionInfo()(确保您拥有最新版本的 R 和软件包)。 @DaveX 请不要传播这种误导性信息; plot(g) 不是显示 gtable 的正确方式,请改用 grid.draw(g) @baptiste 感谢并重做:请注意,如果您尝试使用print(g) 查看g &lt;-arrangeGrob(...) 的结果,您会得到一个列出图形对象而不是图形的文本表。尝试grid.draw(g) 将图形渲染为图形。 —— ggsave 不再适用于(部分或全部)grobs。【参考方案2】:

我对 babptiste 的提议有一些疑问,但最终得到了它。这是你应该使用的:

 # draw your plots
 plot1 <- ggplot(...) # this specifies your first plot
 plot2 <- ggplot(...) # this specifies your second plot
 plot3 <- ggplot(...) # this specifies your third plot

 #merge all three plots within one grid (and visualize this)
 grid.arrange(plot1, plot2, plot3, nrow=3) #arranges plots within grid

 #save
 g <- arrangeGrob(plot1, plot2, plot3, nrow=3) #generates g
 ggsave(file="whatever.pdf", g) #saves g

这应该很好用。

【讨论】:

【参考方案3】:

我认为值得添加。 我遇到了上述问题, ggsave 产生错误: “情节应该是 ggplot2 情节”

感谢这个答案:Saving a graph with ggsave after using ggplot_build and ggplot_gtable 我对上面的代码有一个修改。

  # draw your plots
 plot1 <- ggplot(...) # this specifies your first plot
 plot2 <- ggplot(...) # this specifies your second plot
 plot3 <- ggplot(...) # this specifies your third plot

 #merge all three plots within one grid (and visualize this)
 grid.arrange(plot1, plot2, plot3, nrow=3) #arranges plots within grid

 #save
 ggsave <- ggplot2::ggsave; body(ggsave) <- body(ggplot2::ggsave)[-2]

上面的行需要修复错误

 g <- arrangeGrob(plot1, plot2, plot3, nrow=3) #generates g
 ggsave(file="whatever.pdf", g) #saves g

现在它对我来说很好。

【讨论】:

我需要这个。显然 ggplot2 的开发版本像这样删除了 class-test-fault,但目前的 CRAN 版本(2015-10-21)没有。 这适用于我的marrangeGrob,但不适用于arrangeGrob或grid.arrange.@DaveX,除了如上所示修改ggsave之外,您是否需要做任何其他事情才能使其工作?谢谢!【参考方案4】:

另一种将 grid.arrange 保存到 pdf 文件的简单方法是使用 pdf():

pdf("filename.pdf", width = 8, height = 12) # Open a new pdf file
grid.arrange(plot1, plot2, plot3, nrow=3) # Write the grid.arrange in the file
dev.off() # Close the file

它允许在排列中合并除 ggplots 之外的其他东西,比如表格...

【讨论】:

【参考方案5】:

另一个简单的解决方案: 就在你的grid.arrange()

之后
grid.arrange(plot1, plot2, plot3, nrow=3)

你做一个dev.copy()

dev.copy(pdf,"whatever.pdf")
dev.off()

【讨论】:

【参考方案6】:

您不需要使用arrangeGrob,您可以将grid.arrange的结果直接分配给一个绘图并使用ggsave保存:

p3 <- grid.arrange(p1,p2, nrow = 1)
ggsave("filename.jpg", p3)

【讨论】:

【参考方案7】:

试试这个

ggsave("whatever.png", plot=grid.arrange(plot1, plot2, plot3, nrow=3), device=..., scale = ..., width =..., height = ..., units = "...", dpi = ...)

【讨论】:

以上是关于将 grid.arrange() 绘图保存到文件的主要内容,如果未能解决你的问题,请参考以下文章

如何降低gridExtra的grid.arrange中的主标题?

grid.arrange在菜单后面没有完成绘制大图

如何使用 grid.arrange 排列变量列表?

在闪亮的应用程序中使用滑块控制 grid.arrange 中的水平和垂直空间

用 plotly 绘制多个 ggplot2 绘图

R语言可视化包ggplot2包绘制多个图形并将多个图像垂直堆叠c成一个图像实战(grid.arrange)