Given an Existing plot object is it possible to add a layer UNDERNEATH an existing layer?
Example, in the graph below, is it possible to add geom_boxplot()
to P
such that the boxplot appears underneath geom_point()
?
## Starting from: library(ggplot2) P <- ggplot(data=dat, aes(x=id, y=val)) + geom_point() ## This adds boxplot, but obscures some of the points P + geom_boxplot()
# Which is essentially ggplot(data=dat, aes(x=id, y=val)) + geom_boxplot() + geom_point() ## However, this involves re-coding all of P (after the point insertion of the new layer). ## which is what I am hoping to avoid.
Bonus question: If there are multiple layers in the existing plot, is it possible to indicate where specifically to insert the new layer (with respect to the existing layers)?
set.seed(1) N <- 100 id <- c("A", "B") dat <- data.frame(id=sample(id, N, TRUE), val=rnorm(N))
Elements that are normally added to a ggplot with operator + , such as scales, themes, aesthetics can be replaced with the %+% operator.
The function geom_point() adds a layer of points to your plot, which creates a scatterplot.
There are three layers in this plot. A point layer, a line layer and a ribbon layer. Let us start by defining the first layer, point_layer . ggplot2 allows you to translate the layer exactly as you see it in terms of the constituent elements.
Thanks @baptiste for pointing me in the right direction. To insert a layer underneath all other layers, just modify the layers
element of the plot object.
## For example: P$layers <- c(geom_boxplot(), P$layers)
This handy little function inserts a layer at a designated z-level:
insertLayer <- function(P, after=0, ...) { # P : Plot object # after : Position where to insert new layers, relative to existing layers # ... : additional layers, separated by commas (,) instead of plus sign (+) if (after < 0) after <- after + length(P$layers) if (!length(P$layers)) P$layers <- list(...) else P$layers <- append(P$layers, list(...), after) return(P) }
Expanding on Ricardo' answer, I use the following snippet:
library(ggplot2) `-.gg` <- function(plot, layer) { if (missing(layer)) { stop("Cannot use `-.gg()` with a single argument. Did you accidentally put - on a new line?") } if (!is.ggplot(plot)) { stop('Need a plot on the left side') } plot$layers = c(layer, plot$layers) plot }
As it allows you to:
P <- ggplot(data=dat, aes(x=id, y=val)) + geom_point() P - geom_boxplot()
And the boxplot will be placed below the points.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With