我正在修改使用ggplot构建的图形,方法是更改ggplot_build生成的数据(原因类似于包含空间,因为geom_boxplot中填充美学中使用的缺失因子级别包含空间).据我所知,在这个主题上找到了帮助,我应该能够在结果上调用ggsave之前应用ggplot_gtable和arrangeGrob来保存结果(将grid.arrange()图保存到文件中).
然而,我得到一个错误"情节应该是一个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)))
Run Code Online (Sandbox Code Playgroud)
任何人都可以解释为什么这不起作用?有没有办法在使用ggplot_build()修改数据后使用ggsave?
(我的软件包版本是gridExtra_0.9.1和ggplot2_0.9.3.1)
bap*_*ste 23
它不起作用,因为ggsave
想要一个类的对象ggplot
,而你正在传递一个grob.arrangeGrob
有时会ggsave
假装继承ggplot
,但只有当至少有一个grob属于这个类时; 然而,在这里,你只是通过了一个gtable
.
也许最简单的解决方法是克隆ggsave并绕过类检查,
ggsave <- ggplot2::ggsave; body(ggsave) <- body(ggplot2::ggsave)[-2]
Run Code Online (Sandbox Code Playgroud)
编辑: ggplot2的开发版不再需要这个hack*,因为ggsave
现在适用于任何grob.
*PS:这个hack不再工作,因为arrangeGrob现在返回一个gtable,并且它的print方法不会在设备上绘制.