保存 grid

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

当我在 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()调用的输出,这段代码取自 链接:

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()?
124773 次浏览

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

它与 ggplot 对象的工作方式不同的原因是,ggplot2在默认情况下会保存最后一个 plot (如果没有指定的话) ,因为 ggplot2在不可见的情况下会跟踪最新的 plot,我认为 grid.arrange不应该干扰这个包的计数器 private。

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

这个应该可以。

我觉得值得加进去。 我在上面的代码中遇到了问题,ggsave 产生了一个错误: “ plot 应该是 ggplot2 plot”

感谢这个答案: < a href = “ https://stackoverflow. com/questions/18406991/save-a-graph-with-ggsave-after-using-ggplot-build-and-ggplot-gtable”> 在使用 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

现在我觉得挺好的。

另一个保存 grid 的简单方法是使用 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

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

另一个简单的解决办法: 就在你的 grid.arrange()之后

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

做个 dev.copy()

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

你不需要使用 argeGrob,你可以直接将 grid 的结果分配给 plot,然后使用 ggsave 保存它:

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

试试这个

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