使用ggplot后使用ggsave保存图形
我正在通过修改由ggplot_build生成的数据修改一个使用ggplot构建的图形(出于类似于在geom_boxplot中填充美学所用的缺少因子级别包含空间的原因)。 据我了解我在这个主题上找到的帮助,我应该能够通过应用ggplot_gtable和arrangeGrob保存结果,然后对结果调用ggsave(将grid.arrange()图保存到文件中)。
但是,我得到一个错误“plot should ggplot2 plot”,也有这个简单的可重现的例子:
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)
这是行不通的,因为ggsave
希望类的对象ggplot
,当你路过一个GROB。 arrangeGrob
有时会欺骗ggsave
假装从ggplot
继承,但只有当至少有一个grob属于这个类; 然而,在这里,你只是通过一个gtable
。
也许最简单的解决方法是克隆ggsave并绕过类检查,
ggsave <- ggplot2::ggsave; body(ggsave) <- body(ggplot2::ggsave)[-2]
编辑: ggplot2的开发版本不再需要这个破解*,因为ggsave
现在可以与任何ggsave
工作。
* PS:此黑客不再工作,因为arrangeGrob现在返回一个gtable,并且其打印方法不会在设备上绘图。
解决方法是用grid.draw()绘制gtable对象,然后使用dev.copy()将绘图转移到文件中。
记得在之后也使用dev.off()。
链接地址: http://www.djcxy.com/p/30875.html上一篇: Saving a graph with ggsave after using ggplot
下一篇: Grid of multiple ggplot2 plots which have been made in a for loop