使用ggplot_build和ggplot_gtable后,使用ggsave保存图形

时间:2013-08-23 15:51:55

标签: r ggplot2

我正在修改使用ggplot构建的图形,方法是更改​​ggplot_build生成的数据(原因类似于Include space for missing factor level used in fill aesthetics in geom_boxplot)。据我所知,我在这个主题上找到了帮助,我应该能够在结果(Saving grid.arrange() plot to file)上调用ggsave之前应用ggplot_gtable和arrangeGrob来保存结果。

然而,我得到一个错误“情节应该是一个ggplot2情节”,也是这个简单的可再现的例子:

require('ggplot2')
require('gridExtra')
df <- data.frame(f1=factor(rbinom(100, 1, 0.45), label=c("m","w")), 
                  f2=factor(rbinom(100, 1, 0.45), label=c("young","old")),
                  boxthis=rnorm(100))
g <- ggplot(aes(y = boxthis, x = f2, fill = f1), data = df) + geom_boxplot()
dd <- ggplot_build(g)

# Printing the graph works:
print(arrangeGrob(ggplot_gtable(dd)))

# Saving the graph doesn't:
ggsave('test.png',arrangeGrob(ggplot_gtable(dd)))

任何人都可以解释为什么这不起作用?有没有办法在使用ggplot_build()修改数据后使用ggsave?

(我的软件包版本是gridExtra_0.9.1和ggplot2_0.9.3.1)

2 个答案:

答案 0 :(得分:23)

它不起作用,因为ggsave想要一个类ggplot的对象,而你正在传递一个grob。 arrangeGrob有时会假装ggsave假装继承自ggplot,但只有当至少有一个grob属于这个类时才会这样;但是,在这里,您只传递gtable

也许最简单的解决方法是克隆ggsave并绕过类检查,

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

修改:ggplot2的开发版不再需要此hack *,ggsave now works with any grob

* PS:这个黑客不再工作,因为arrangeGrob现在返回一个gtable,并且它的print方法不会在设备上绘制。

答案 1 :(得分:1)

解决方法是使用grid.draw()绘制gtable对象,然后使用dev.copy()将绘图传输到文件。

请记住以后也使用dev.off()。