On Mon, Jul 15, 2013 at 1:08 PM, Thaler,Thorn,LAUSANNE,Applied
Mathematics <thorn.tha...@rdls.nestle.com> wrote:
> 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.
>

This seems to show which layer is which:

> sapply(p$layers, function(x) x$geom$objname)
[1] "pointrange" "point"


--
Statistics & Software Consulting
GKX Group, GKX Associates Inc.
tel: 1-877-GKX-GROUP
email: ggrothendieck at gmail.com

______________________________________________
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