modifying ggplot objects after creation

Is there a preferred way to modify ggplot objects after creation?

For example I recommend my students to save the r object together with the pdf file for later changes...

library(ggplot2)
graph <- 
  ggplot(mtcars, aes(x=mpg, y=qsec, fill=cyl)) +
  geom_point() +
  geom_text(aes(label=rownames(mtcars))) +
  xlab('miles per galon') +
  ggtitle('my title')

ggsave('test.pdf', graph)
save(graph, file='graph.RData')

So new, in case they have to change title or labels or sometimes other things, they can easily load the object and change simple things.

load('graph.RData')
print(graph)
graph + 
  ggtitle('better title') +
  ylab('seconds per quarter mile')

What do I have to do for example to change the colour to discrete scale? In the original plot I would wrap the y in as.factor. But is there a way to do it afterwards? Or is there a better way on modifying the objects, when the data is gone. Would love to get some advice.


Solution 1:

You could use ggplot_build() to alter the plot without the code or data:

Example plot:

data("iris")

p <- ggplot(iris) + 
  aes(x = Sepal.Length, y = Sepal.Width, colour = Species) + 
  geom_point()

Colours are respective to Species.

Disassemble the plot using ggplot_build():

q <- ggplot_build(p)

Take a look at the object q to see what is happening here. To change the colour of the point, you can alter the respective table in q:

q$data[[1]]$colour <- "black"

Reassemble the plot using ggplot_gtable():

q <- ggplot_gtable(q)

And plot it:

plot(q)

Now, the points are black.