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

我正在尝试使用ggplot2绘制多个图,使用grid.arrange()来排列它们。 由于我设法find某人描述了我所遇到的确切问题,所以我从链接中引用了问题描述:

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

 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() 

相同的链接给出了下面的解决scheme:

 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()调用的输出在下面的代码,这是从链接 :

 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()? 

grid.arrange直接在设备上绘制。 另一方面, arrangeGrob不会画任何东西,而是返回一个ggsave(file="whatever.pdf", g) ,你可以传递给ggsave(file="whatever.pdf", g)

它的工作原理不同于ggplot对象,默认情况下,如果没有指定,最后一个绘图被保存,ggplot2无形地跟踪最新的绘图,我不认为grid.arrange应该grid.arrange这个私人的计数器包。

我有一些问题与babptiste的build议,但终于得到了。 这是你应该使用的:

  # 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 

这应该很好。

另一个简单的方法来保存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安排,如表…

我认为这是值得添加的。 我有上面的问题,ggsave产生一个错误:“情节应该是一个ggplot2阴谋”

感谢这个答案: 在使用ggplot_build和ggplot_gtable之后使用ggsave保存一个图表我对上面的代码进行了修改。

  # 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 

现在它对我很好。