grid.arrange()搭配pdf()使用时生成PDF无内容如何解决
问题原因
你导出的PDF无绘图内容,核心是grid.arrange()的运行逻辑和R绘图设备的机制不匹配:
- 直接运行
grid.arrange(p1,p2, ncol=2)并赋值给变量时,函数会立刻在当前激活的交互绘图设备(如RStudio的绘图面板)输出拼接完成的图形,赋值得到的p3仅为记录绘图结构的grob对象,不携带可重复触发渲染的完整逻辑。 - 后续调用
pdf()开启新的PDF绘图设备后,直接输入p3不会触发实际的绘图渲染动作,因此关闭设备后生成的PDF为空白文件。
可行解决方法
以下两种方案均能正常导出拼接图形,按需选择即可:
方案1:开启PDF设备后再执行拼接操作
不要提前赋值grid.arrange()的运行结果,在pdf()设备激活的上下文中直接执行拼接绘图,内容会直接写入PDF文件:
library(ggplot2) library(gridExtra) p1 <- ggplot(mtcars, aes(mpg)) + stat_ecdf() p2 <- ggplot(mtcars, aes(cyl)) + stat_ecdf() # 开启PDF绘图设备 pdf(file = "plot.pdf") # 直接在当前激活的PDF设备中完成图形拼接与绘制 grid.arrange(p1, p2, ncol = 2) # 关闭设备完成写入 dev.off()
方案2:需提前存储拼接对象时换用arrangeGrob()
如果需要提前把拼接好的图形存为对象、后续再统一导出,使用arrangeGrob()生成可复用的grob拼接对象(该函数不会立刻在交互设备输出图形),导出时显式调用绘图方法把对象渲染到PDF设备即可:
library(ggplot2) library(gridExtra) p1 <- ggplot(mtcars, aes(mpg)) + stat_ecdf() p2 <- ggplot(mtcars, aes(cyl)) + stat_ecdf() # 生成可复用的拼接图形对象,不会提前绘图 p3 <- arrangeGrob(p1, p2, ncol = 2) pdf(file = "plot.pdf") # 显式将拼接对象渲染到PDF设备 grid.draw(p3) dev.off()
补充说明:如果是在非交互场景(比如通过
source()运行R脚本、命令行执行R脚本)导出ggplot类图形,哪怕是单张图,也建议显式用print()包裹绘图对象,避免非交互环境下不自动触发渲染导致的空白文件问题。
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

