Eliminar leyendas adicionales en ggplot2

91

Tengo un marco de datos simple que estoy tratando de hacer un diagrama combinado de líneas y puntos usando ggplot2. Suponiendo que mis datos se vean así:

df <- data.frame(x=rep(1:10,2), y=c(1:10,11:20), 
                 group=c(rep("a",10),rep("b",10)))

Y estoy tratando de hacer una trama:

g <- ggplot(df, aes(x=x, y=y, group=group))
g <- g + geom_line(aes(colour=group))
g <- g + geom_point(aes(colour=group, alpha = .8))
g

El resultado se ve bien con una excepción. Tiene una leyenda adicional que muestra la capa alphapara mi geom_point.

Leyenda adicional para la transparencia de <code> geom_point </code>

¿Cómo puedo mantener la leyenda que muestra los colores del grupo, pero no la que muestra mi configuración alfa?

Wilduck
fuente

Respuestas:

172

La estética se puede configurar o mapear dentro de una ggplotllamada.

  • Una estética definida internamente aes(...)se mapea a partir de los datos y se crea una leyenda.
  • Una estética también puede establecerse en un valor único, definiéndola por fuera aes().

En este caso, parece que desea establecer alpha = 0.8 y mapear colour = group .

Para hacer esto,

Coloque el alpha = 0.8exterior de la aes()definición.

g <- ggplot(df, aes(x = x, y = y, group = group))
g <- g + geom_line(aes(colour = group))
g <- g + geom_point(aes(colour = group), alpha = 0.8)
g

ingrese la descripción de la imagen aquí

Para cualquier variable mapeada , puede suprimir la apariencia de una leyenda usando guide = 'none'en la scale_...llamada apropiada . p.ej.

g2 <- ggplot(df, aes(x = x, y = y, group = group)) + 
        geom_line(aes(colour = group)) +
        geom_point(aes(colour = group, alpha = 0.8))
g2 + scale_alpha(guide = 'none')

Que devolverá una trama idéntica

EDITAR El comentario de @ Joran es acertado, hice mi respuesta más completa

mnel
fuente
18
Este es el método correcto, ya que el OP está configurando en lugar de mapear una estética, pero en general puede suprimir la aparición de cualquier leyenda usando algo como g + scale_alpha(guide = "none").
joran
En efecto. La respuesta ha sido elaborada. Tiene más sentido tener una respuesta completa, no solo específica para el problema de OP.
mnel
4
Muchas gracias por la explicación adicional. Esto contribuye en gran medida a ayudarme a comprender la filosofía de ggplot.
Wilduck
2
He estado usando ggplot durante más de un año y NUNCA entendí la diferencia entre una variable asignada o establecida. Esta es, con mucho, la mejor respuesta SO que he visto, felicidades.
Amit Kohli
1
@theforestecologist Eso es porque la groupestética no genera escalas ni guías por sí sola. Siempre es como modificar algo más. Nunca obtendrá una leyenda por la estética del "grupo".
joran
41

Simplemente agregue el show.legend = Fcódigo después de la parte donde no lo desea.

g <- ggplot(df, aes(x=x, y=y, group=group))
g <- g + geom_line(aes(colour=group))
g <- g + geom_point(aes(colour=group, alpha = .8), show.legend = F)
CSV
fuente
1
Esto es mucho más intuitivo que el mapeo frente a la estética de la configuración (aunque eso también aclara muchos malentendidos)
Wassadamo
1

Para versiones antiguas de ggplot2 (versiones anteriores a 0.9.2, lanzadas a finales de 2012), esta respuesta debería funcionar:

Intenté esto con a colour_scaley no funcionó. Parece que el colour_scale_hueelemento funciona como una función con un parámetro predeterminado TRUE. Añadí scale_colour_hue(legend=FALSE)y funcionó.

No estoy seguro de si este es el caso de todos los elementos de escala de color en ggplot

Georgette
fuente
3
El uso legenden una scale_*llamada está en desuso, es mejor hacerlo scale_colour_hue(guide = "none").
Gregor Thomas
3
teniendo en cuenta que legend=FALSEestá en desuso, como lo señala el comentario de @shujaa, esta es efectivamente una respuesta duplicada, es decir, para agregar guide = "none"a una scale_fill/color*función.
David LeBauer