Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Saving a graph with ggsave after using ggplot_build and ggplot_gtable

Tags:

r

ggplot2

ggsave

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)

like image 916
Don't panic Avatar asked Aug 23 '13 15:08

Don't panic


People also ask

How to save plot using ggsave?

In most cases ggsave() is the simplest way to save your plot, but sometimes you may wish to save the plot by writing directly to a graphics device. To do this, you can open a regular R graphics device such as png() or pdf() , print the plot, and then close the device using dev. off() .

How to save a graph in r ggplot?

You can either print directly a ggplot into PNG/PDF files or use the convenient function ggsave() for saving a ggplot. The default of ggsave() is to export the last plot that you displayed, using the size of the current graphics device. It also guesses the type of graphics device from the extension.

What are the default dimensions that Ggsave ()` saves an image as?

2.1. The default size of the saved image is equal to the size of Plots pane (the “graphics device”) in RStudio, which can be found with dev. size() . Notice that the result of dev. size() and the message we receive when saving the plot with ggsave() give the same dimensions.


2 Answers

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.

like image 70
baptiste Avatar answered Oct 08 '22 04:10

baptiste


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.

like image 26
Bakaburg Avatar answered Oct 08 '22 04:10

Bakaburg