superponer - ggplot2: agrega una línea para el promedio por grupo
superponer graficas en r ggplot (2)
A partir de su pregunta, este df$x
es relevante para sus datos, especialmente si puede reordenarlo. ¿Qué tal si usamos group
como x y jitter
la posición x para separar los puntos?
ggplot(data=df, aes(x=group,y=y,color=group)) + geom_point() +
geom_jitter(position = position_jitter(width = 0.4)) +
geom_errorbar(stat = "hline", yintercept = "mean",
width=0.8,aes(ymax=..y..,ymin=..y..))
He usado la barra de errores en lugar de h_line (y he contraído ymax e ymin en y) porque hline es compleja. Si alguien tiene una mejor solución para esa parte, me encantaría verla.
actualizar
Si desea conservar el orden de X, intente con esta solución (con X modificado)
df$x = factor(df$x)
ggplot(data = df, aes(x, y, group=group)) +
facet_grid(.~group,space="free",scales="free_x") +
geom_point() +
geom_line(stat = "hline", yintercept = "mean")
library(ggplot2)
orderX <- c("A" = 1, "B" = 2, "C" = 3)
y <- rnorm(20)
x <- as.character(1:20)
group <- c(rep("A", 5), rep("B", 7), rep("C", 5), rep("A", 3))
df <- data.frame(x, y, group)
df$lvls <- as.numeric(orderX[df$group])
ggplot(data = df, aes(x=reorder(df$x, df$lvls), y=y)) +
geom_point(aes(colour = group)) +
geom_line(stat = "hline", yintercept = "mean", aes(colour = group))
Quiero crear un gráfico como este:
Esto sí funciona, cuando no necesito reordenar los valores de X, sin embargo, cuando uso reordenar, ya no funciona.
A partir de ggplot2 2.x, este enfoque lamentablemente está roto.
El siguiente código proporciona exactamente lo que quería, con algunos cálculos adicionales por adelantado:
library(ggplot2)
library(data.table)
orderX <- c("A" = 1, "B" = 2, "C" = 3)
y <- rnorm(20)
x <- as.character(1:20)
group <- c(rep("A", 5), rep("B", 7), rep("C", 5), rep("A", 3))
dt <- data.table(x, y, group)
dt[, lvls := as.numeric(orderX[group])]
dt[, average := mean(y), by = group]
dt[, x := reorder(x, lvls)]
dt[, xbegin := names(which(attr(dt$x, "scores") == unique(lvls)))[1], by = group]
dt[, xend := names(which(attr(dt$x, "scores") == unique(lvls)))[length(x)], by = group]
ggplot(data = dt, aes(x=x, y=y)) +
geom_point(aes(colour = group)) +
facet_grid(.~group,space="free",scales="free_x") +
geom_segment(aes(x = xbegin, xend = xend, y = average, yend = average, group = group, colour = group))
La imagen resultante: