Leyenda

En capítulos anteriores vimos cómo añadir facetas a un gráfico y cómo modificarlas. Sin embargo, si elegimos la misma variable para las facetas y para el color no tiene sentido añadir una leyenda. Por ello, en esta sección aprenderemos cómo eliminar la leyenda de un gráfico de ggplot2.

Cómo eliminar la leyenda de un gráfico de ggplot2

Antes de nada fijamos el tema con la función theme_set() y cargamos el plot base. Si no te acuerdas cómo fijar un tema puedes volver a leer la sección sobre cómo personalizar un tema en ggplot.

library(ggplot2)

theme_set(theme_elartedeldato())
ggplot(msleep, aes(x = sleep_total, y = sleep_rem, color = vore)) +
  geom_point() +
  labs(
    title = "El sueño de los mamíferos",
    subtitle = "Sueño REM frente a las horas totales de sueño",
    caption = "Proceedings of the National Academy of Sciences, 104 (3):1051-1056, 2007. elartedeldato.com",
    x = "Horas de sueño en total", y = "Horas de sueño en fase REM"
  ) +
  facet_wrap("vore") -> p
p

La respuesta es sencilla aunque poco intuitiva. En la función theme() emplearemos el argumento legend.position='none' indicando que la posición de la misma es ninguna.

p + theme(legend.position = "none")

Cómo cambiar la posición de la leyenda en ggplot2

Así mismo, si quisiéramos cambiar la leyenda de posición sólo necesitaríamos indicar su nueva posición a través de las opciones: top, bottom, left, right, véase arriba, abajo, izquierda o derecha respectivamente.

p + theme(legend.position = "top")

Cómo modificar el título de la leyenda en un gráfico en ggplot2

En ggplot2, modificar los títulos de un gráfico depende del elemento del mismo al que se refieran. Por ejemplo, para cambiar el título principal, ya vimos que necesitaba recurrir a la función labs() o ggtitle(). Muy parecido a la manera de modificar los títulos de los ejes. No obstante, en el caso de la leyenda, el proceso no es tan intuitivo.

Para modificar el título de la leyenda en ggplot, debemos hacer referencia a la estética del gráfico a la que va asociada. En este caso, la leyenda hace referencia al color, por lo que dentro de la función labs() asignaremos al argumento color el valor del nuevo título. Es decir,

p + labs(color = "Género")

De igual manera, para modificar la leyenda referida a cualquier otro elemento de la estética, utilizaríamos el nombre de dicho elemento. Por ejemplo, para el tamaño emplearímos el argumento size:

labs(size = ...)

Para la transparencia, alpha:

labs(alpha = ...)

Otra alternativa, sería utilizando la función de la escala de la estética correspondiente, en este caso scale_color_discrete().

p + scale_color_discrete("Género")

Cómo unificar varias leyendas en ggplot2

Otro caso interesante es cuando trabajamos con varias leyendas asignadas a la misma variable. En estos casos, por defecto ggplot generará una leyenda para cada variable, pero generalmente el objetivo es tener una sola leyenda, ya que se refiere a una sola variable.

Imaginemos entonces que tomamos la variable awake, horas despierto, para la transparencia de los puntos y su tamaño. De esta forma, conseguimos enfatizar el efecto de la variable en la visualización.

ggplot(msleep, aes(x = sleep_total, y = sleep_rem, alpha = awake, size = awake)) +
  geom_point()

Por defecto, ggplot va a generar dos leyendas diferentes, una para cada estética.

¿Cómo podemos hacer para unificar ambas leyendas? Es muy sencillo. Simplemente, deberemos cambiar los nombres de los títulos y asignar el mismo a ambas con la función labs():

ggplot(msleep, aes(x = sleep_total, y = sleep_rem, alpha = awake, size = awake)) +
  geom_point() +
  labs(alpha = "Horas despierto", size = "Horas despierto")

Cómo añadir expresiones a los títulos de la leyenda

Al igual que en título principal o para los títulos de los ejes, si queremos añadir en el título de la leyenda expresiones matemáticas recurrimos a la función expression() de la siguiente manera:

p +
  labs(
    color = expression(paste(x^2/y*z))
  )

Cómo añadir expresiones en la leyenda de un gráfico de ggplot2

En primer lugar, generaremos una variable nueva new_vore que contenga letras griegas utilizadas en ciencias.

msleep$new_vore <- as.factor(msleep$vore)
levels(msleep$new_vore) <- c("alpha", "beta", "gamma", "delta", "NA")

Por defecto, ggplot representará literalmente los valores de la leyena sin interpretarlos.

ggplot(msleep, aes(x = sleep_total, y = sleep_rem, color = new_vore)) +
  geom_point()

La primera alternativa que presentamos es la más sencilla, aunque requiere cargar un paquete adicional que suele utilizarse para trabajar con escalas de la estética en ggplot, principalemnte. Hablamos del paquete scales.

La función parse_format() nos pemitirá interpretar los valores de la leyenda adecuadamente.

library(scales)

ggplot(msleep, aes(x = sleep_total, y = sleep_rem, color = new_vore)) +
  geom_point() +
  scale_color_discrete(labels = parse_format())

Cómo añadir expresiones en la leyenda sin utilizar otras librerías

Una segunda alternativa sin pasar por otras librerías es hacerlo manualmente modificando el argumento labels de scale_color_discrete().

Cómo añadir expresiones en la leyenda con expression()

ggplot(msleep, aes(x = sleep_total, y = sleep_rem, color = new_vore)) +
  geom_point() +
  scale_color_discrete(
    labels = c(
      alpha = expression(alpha),
      beta = expression(beta),
      gamma = expression(gamma),
      delta = expression(delta)
  ))

Cómo añadir expresiones en la leyenda con bquote()

ggplot(msleep, aes(x = sleep_total, y = sleep_rem, color = new_vore)) +
  geom_point() +
  scale_color_discrete(
    labels = list(
      bquote(alpha),
      bquote(beta),
      bquote(gamma),
      bquote(delta)
  ))

Como vemos esta alternativa es algo más tediosa, ya que obliga a modificar cada valor uno a uno.

Cómo cambiar el estilo del título de la leyenda

Para cambiar el estilo del título de la leyenda en ggplot2, utilizamos la función theme(). Con esta función podremos personalizar el estilo de fuente, el color, el tamaño de letra o incluso la justificación del texto a través del argumento legend.title y la función element_text(). Veamos un ejemplo.

p +
  theme(
    legend.title = element_text(size = 20, color = "orange", hjust = 0.5)
  )

Advertencia

Un error muy común trabajando con fuentes es el siguiente:

Error in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y,  : 
  polygon edge not found
In addition: There were 50 or more warnings (use warnings() to see the first 50)

para solucionarlo, después de añadir la fuente, aplica la función showtext_auto() y listo! 🎉

Cómo añadir un salto de línea en el título de la leyenda

El salto de línea de la leyenda debe añadirse directamente sobre el nombre del título de la misma. Es decir, a través de la función labs().

p +
  labs(
    color = "Género de \nlos mamíferos"
  )

En resumen…
  • labs(color = ..., size = ...) para modificar los títulos de las leyendas

  • labs(alpha = 'Nombre leyenda', size = 'Nombre leyenda') utiliza el mismo nombre en cada estética para unificar la leyenda

  • labs(color = expression(...)) para añadir expresiones matemáticas en el título de la leyenda

  • scale_color_discrete(labels = parse_format()) para interpretar expresiones matemáticas en la leyenda

  • theme(legend.title = element_text(...)) para modificar el estilo del texto del título de la leyenda

  • labs(color = '...\n...') para el salto de línea