manually - Diferentes claves de leyenda dentro de la misma leyenda en ggplot2
main ggplot in r (2)
Digamos que no necesito una asignación de variable ''adecuada'', pero me gustaría tener claves de leyenda para ayudar a comprender el gráfico. Mis datos reales son similares a los siguientes df
df <- data.frame(id = 1:10, line = rnorm(10), points = rnorm(10))
library(ggplot2)
ggplot(df) +
geom_line(aes(id, line, colour = "line")) +
geom_point(aes(id, points, colour = "points"))
Básicamente, me gustaría que la clave de leyenda relativa a los points
sea ... solo un punto, sin la línea en el medio. Me acerqué a eso con esto:
library(reshape2)
df <- melt(df, id.vars="id")
ggplot() +
geom_point(aes(id, value, shape = variable), df[df$variable=="points",]) +
geom_line(aes(id, value, colour = variable), df[df$variable=="line",])
pero define dos leyendas separadas. Arreglar el segundo código (y tener que remodelar mis datos) también estaría bien, pero preferiría una forma (si existe) de cambiar manualmente cualquier clave de leyenda (y seguir usando el primer enfoque). ¡Gracias!
EDITAR:
gracias @alex, quien actualizó mi memoria sobre el mapeo de variables. Sin embargo, la forma más fácil que tengo hasta ahora es la siguiente (¡muy mal truco!):
df <- data.frame(id = 1:10, line = rnorm(10), points = rnorm(10))
ggplot(df) +
geom_line(aes(id, line, colour = "line")) +
geom_point(aes(id, points, shape = "points")) +
theme(legend.title=element_blank())
que simplemente está ocultando el título de las dos leyendas diferentes .
Otras ideas mas que bienvenidas !!!
No conozco ninguna forma de hacer esto fácilmente, pero puede hacer una versión de pirateo como esta (usando su marco de datos fundido):
p <- ggplot(df.m, aes(id, value)) +
geom_line(aes(colour = variable, linetype = variable)) + scale_linetype_manual(values = c(1,0)) +
geom_point(aes(colour = variable, alpha = variable)) + scale_alpha_manual(values = c(0,1))
La clave es que necesita obtener la asignación correcta para que se muestre correctamente en la leyenda. En este caso, hacerlo bien, significa engañarlo para que se vea como usted quiere. Probablemente vale la pena señalar que esto solo funciona porque puede establecer el linetype
de linetype
en blanco (0) y luego usar la escala alpha
para los puntos. No puedes usar alpha
para ambos, porque solo tomará una escala.
Puede usar la función override.aes=
inside guides()
para cambiar la apariencia predeterminada de la leyenda. En este caso, su guía es color=
y luego debe configurar shape=c(NA,16)
para eliminar la forma de la línea y luego linetype=c(1,0)
para eliminar la línea del punto.
ggplot(df) +
geom_line(aes(id, line, colour = "line")) +
geom_point(aes(id, points, colour = "points"))+
guides(color=guide_legend(override.aes=list(shape=c(NA,16),linetype=c(1,0))))