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


137

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

当我使用ggsave()after 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()

相同的链接提供以下解决方案:

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

6
使用png(); grid.arrange(); ggplot(); ggplot(); dev.off()
Andrie

2
不是print(ggplot())
IRTFM

@DWin是的,可能!:-)
Andrie

1
@Andrie您所建议的有效,但图像的分辨率非常低。当我保存单个ggplot使用ggsave(),图像的分辨率要高得多。有没有一种方法可以保存grid.arrange()高分辨率的输出,就像保存单个绘图一样ggsave()?例如,如果我提供选项,png(...,height=1600, width=2500)则图像看起来非常模糊。
我喜欢为代码

Answers:


142

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

它与ggplot对象不同的原因是,ggplot2在看不到的情况下跟踪最新的绘图,因此默认情况下,如果没有指定,则默认保存最后一个绘图,这与ggplot对象不同,我不认为grid.arrange应该将此计数器私有化。


3
当我尝试此操作时,我收到一条错误消息,告诉我g不是正确的类型?
杰克·艾德利2014年

@JackAidley提出一个新问题,并提供一个最少的可重复生成的示例以及您的sessionInfo()(确保您具有R和包的最新版本)。
baptiste 2014年

3
@DaveX请不要散布这种误导性信息;plot(g)不是显示gtable,用正确的方式grid.draw(g)来代替。
baptiste's

@baptiste感谢和返工:请注意,如果你试图看到的结果g <-arrangeGrob(...)print(g)你得到一个文本表格,列出了图形对象,而不是图形。尝试grid.draw(g)将图形渲染为图形。–
戴夫X

7
ggsave不再与(部分或全部)grob一起使用。
vak 2015年

47

我对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

这应该运作良好。


24

将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以外的其他内容,例如表格...


7

我认为值得补充。我在上述问题上遇到了问题,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

现在对我来说很好。


我需要这个 显然,ggplot2的开发版本删除了此类的class-test-fault,但当前(2015-10-21)的CRAN版本并未删除。
戴夫X

2
这对我来说适用于marrangeGrob,但不适用于rangingGrob或grid.arrange。@ DaveX,除了修改ggsave之外,您是否需要做其他任何事情来使其工作?谢谢!
k13

3

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

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

2

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

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

你做一个 dev.copy()

dev.copy(pdf,"whatever.pdf")
dev.off()
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.