Saving a graph with ggsave after using ggplot_build and ggplot_gtable
ggplot2, ggsave, r
Solution
it does not work because `ggsave` wants an object of class `ggplot`, while you're passing a grob. `arrangeGrob` will sometimes trick `ggsave` in pretending inheritance from `ggplot`, but only when at least one of the grobs belongs to this class; here, however, you're only passing a `gtable`.
Perhaps the easiest workaround is to clone ggsave and bypass the class check,
ggsave <- ggplot2::ggsave; body(ggsave) <- body(ggplot2::ggsave)[-2]
Edit: The dev version of ggplot2 no longer requires this hack*, as `ggsave` now works with any grob.
*PS: this hack works no longer, as arrangeGrob now returns a gtable, and its print method does not draw on a device.
Problem
I am modifying a graph built with ggplot by altering the data produced by ggplot_build (for a reason similar to Include space for missing factor level used in fill aesthetics in geom_boxplot). As far as I understand the help I found on this topic, I should be able to save the result by applying ggplot_gtable and arrangeGrob before calling ggsave on the results (Saving grid.arrange() plot to file). However I obtain an error "plot should be a ggplot2 plot", also with this simple reproductible example: ``` 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))) ``` Can anybody explain why this does not work ? Is there a way to use ggsave after modifying the data by using ggplot_build() ? (My version of the packages are gridExtra_0.9.1 and ggplot2_0.9.3.1)