Saving a graph with ggsave after using ggplot_build and ggplot_gtable

Solution 1:

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.

Solution 2:

A work around is to plot the gtable object with grid.draw() and then use dev.copy() to transfer the plot to a file.

Remember to use also dev.off() just afterward.