我正在通过更改ggplot_build生成的数据来修改由ggplot构建的图形(原因类似于在geom_boxplot中用于填充美学的“包含缺少的因子水平的空间”)。据我了解到的有关该主题的帮助,我应该能够通过在调用ggsave之前将ggplot_gtable和rangingGrob应用于保存结果(将grid.arrange()图保存到file)。
但是,通过这个简单的可复制示例,我得到一个错误“图应为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)
它不起作用,因为在传递grob时需要ggsave
class类的对象ggplot
。arrangeGrob
有时会ggsave
假装从继承ggplot
,但仅当至少一个grob属于此类时才会欺骗;但是,在这里,您只传递了gtable
。
也许最简单的解决方法是克隆ggsave并绕过类检查,
ggsave <- ggplot2::ggsave; body(ggsave) <- body(ggplot2::ggsave)[-2]
编辑: ggplot2的开发版本不再需要此hack *,因为ggsave
现在可以与任何grob一起使用。
* PS:该hack不再起作用,因为rangingGrob现在返回一个gtable,并且其打印方法无法在设备上绘制。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句