tutorial - Insertar capa debajo de las capas existentes en el objeto ggplot2
superponer graficas en r ggplot (2)
Como se muestra en la documentación de ggplot here , puede configurar un objeto ggplot esqueleto y agregar capas. El orden en que especifica las capas es el orden en que aparecerán en su parcela.
Esto obtendrá su salida esperada:
ggplot() +
geom_boxplot(data = dat, aes(x=id, y=val)) +
geom_point(data = dat, aes(x=id, y=val))
Esto obtendrá su salida incorrecta:
ggplot() +
geom_point(data = dat, aes(x=id, y=val)) +
geom_boxplot(data = dat, aes(x=id, y=val))
Creo que esto también responde a tu pregunta extra :)
Dado un objeto de trazado existente, ¿es posible agregar una capa BAJO UNA capa existente?
Por ejemplo, en el gráfico a continuación, ¿es posible agregar geom_boxplot()
a P
tal manera que el diagrama de caja aparezca debajo de 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()
Rendimiento esperado:
# 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.
Pregunta extra: si hay varias capas en el trazado existente, ¿es posible indicar dónde insertar específicamente la nueva capa (con respecto a las capas existentes)?
DATA DE MUESTRA
set.seed(1)
N <- 100
id <- c("A", "B")
dat <- data.frame(id=sample(id, N, TRUE), val=rnorm(N))
Gracias @baptiste por indicarme la dirección correcta. Para insertar una capa debajo de todas las demás capas, simplemente modifique el elemento de layers
del objeto de trazado.
## For example:
P$layers <- c(geom_boxplot(), P$layers)
Respuesta a la pregunta de bonificación:
Esta pequeña y práctica función inserta una capa en un nivel z designado:
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)
}