Dear all,

Is there a possibility to remove a geom from a ggplot? Background suppose I 
have a function which returns a ggplot object after some data re-formatting and 
aggregation. While this ggplot object is fine in 90% of the cases it turns out 
that for some cases I want to suppress one of the layers which was added to the 
plot.

I could look at the source code of the function and write a new one, which has 
an additional flag parameter, with which I could ask the function to add or not 
to add the geom, but this sounds a bit of overkill to me and it would be nice, 
if I could just remove the particular layer?

An example is in order to make my point clearer:

library(ggplot2)
d <- data.frame(x=rep(1:10, each = 10), y = rnorm(100), grp = rep(1:10, 10))

makePlot <- function() {
  ggplot(d, aes(x = x, y = y)) + stat_summary(fun.data = "mean_cl_normal", 
color = "red") + geom_point() 
}

(p <- makePlot())

## Now I want to have lines instead of points, but of course the points are 
still there
p + geom_line(aes(group = grp, color = grp))

Again, it would not be difficult to rewrite makePlot to deal with that, but for 
me this seems to be error prone / duplication. So ideally, I would like to do 
something like:

p %-% geom_point()

which is ambiguous of course, as there can be several point layers in the plot. 
Looking at 

str(p)

I see that there is a layers slot, so I can do

q <- p
q$layers <- q$layers[-2]        
q + geom_line(aes(group = grp, color = grp))

which does actually what I want.

However, is there a way to do that in a more automated way? For now I have to 
inspect the object and to decide which layer I want to delete, otherwise I can 
get something like this:

makePlot2 <- function() {
  ggplot(d, aes(x = x, y = y)) + geom_point() + stat_summary(fun.data = 
"mean_cl_normal", color = "red")
}
q <- makePlot2()
q$layers <- q$layers[-2]        
q + geom_line(aes(group = grp, color = grp))

which removes the error bars but not the points (as the order in layers 
changed). So any ideas how to proceed in this case? If there is a nice way, I 
could even think of overloading %-% which would fit nicely in the idea of a 
plot which can not only be added layer by layer, but where I also could remove 
certain layers.

Maybe (and even probable) there is a very good idea why I should not do that at 
all and I would be curious to hear these things as well. For now I am yet 
interested to know how I can remove layers of a plot conveniently. 

Thanks for your help!

Kind Regards,

Thorn Thaler 

______________________________________________
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

Reply via email to