Estilo y escala

En el último capítulo vimos cómo cambiar el color en un gráfico de ggplot. Pero además del color, existen otros aspectos interesantes sobre la estética de los puntos que se pueden ser la forma, tamaño, transparencia o incluso el borde del punto. Ahora veremos cómo modificar cada uno de ellos.

Primero, fijamos el tema con la función theme_set(). 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())

Antes de nada, como vamos a trabajar con la geometría del gráfico, tomaremos el último gráfico sobre el que hemos estado trabajando hasta el momento, eliminando la geometría, geom_point().

msleep$vore <- as.factor(msleep$vore)
levels(msleep$vore) <- c("carnívoro", "herbívoro", "insectívoro", "omnívoro")

ggplot(msleep, aes(x = sleep_total, y = sleep_rem, color = vore)) +
  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

Cómo cambiar la forma de los puntos

La forma de los puntos de un gráfico de ggplot, se puede modificar con el argumento shape dentro de la función de la estética, aes().

p + geom_point(aes(shape = vore))

Al igual que con el color, también sería posible modificar la forma general de todos los puntos del gráfico indicando dicha forma fuera de la función aes(), directamente en geom_point().

p + geom_point(shape = "triangle")

Cada forma lleva asociada un número, por lo que se puede especificar bien el nombre de la forma, o el número correspondiente. La lista de formas disponibles es la siguiente:

shapes <- data.frame(
  shape = c(0:19, 22, 21, 24, 23, 20),
  x = 0:24 %/% 5,
  y = -(0:24 %% 5)
)
ggplot(shapes, aes(x, y)) +
  geom_point(aes(shape = shape), size = 5, fill = "red") +
  geom_text(aes(label = shape), hjust = 0, nudge_x = 0.15) +
  scale_shape_identity() +
  expand_limits(x = 4.1) +
  theme_void()

Fuente: Documentación oficial de ggplot2

El nombre de la leyenda de la forma, se puede cambiar a través de la función scale_shape(name="...").

Cómo cambiar el tamaño de los puntos

En ggplot, para cambiar cualquier elemento de la estética se sigue el mismo patrón. En el caso del tamaño de los puntos, basta con indicar size como argumento y el nombre de la variable sobre la que irá asociada.

p +
  geom_point(
    aes(size = awake)
  )

Recordamos, que el tamaño tiene sentido asociarlo a una variable continua o, en todo caso, categórica ordinal, por eso no deberíamos asociarla a vore, tipo de mamífero según su alimentación. De este modo elegimos awake, total de horas de sueño, una variable continua.

Cómo cambiar la transparencia de los puntos

En cuanto a la transparencia de los puntos, en ggplot recibe el nombre de alpha, siguiendo la nomenclatura global del color, y se indica de la misma manera que las estéticas anteriores:

p +
  geom_point(
    aes(alpha = awake)
  )

Esta característica suele ser muy útil cuando se trabaja con una gran cantidad de datos, para mostrar dónde se concentra más la información.

Para esos casos, se suele emplear el mismo alpha para todo el conjunto de datos, véase:

p +
  geom_point(
    alpha = 0.5
  )

Cómo cambiar el borde de los puntos

Si nos fijamos, cada uno de los puntos de un gráfico de ggplot, tiene un borde muy fino alrededor. Este borde puede ser aumentado, reducido o incluso eliminado a través del argumento stroke.

p +
  geom_point(
    shape = 21, stroke = 3
  )

Podíamos también haber eliminado el borde los puntos indicando stroke=0.

p +
  geom_point(
    stroke = 0
  )

Cómo asignar dos escalas diferentes a una misma estética

Para esta sección necesitaremos instalar la librería ggnewscale.

En ocasiones, cuando el gráfico se vuelve muy complejo, con varias capas, la modificación de los elementos básicos no suele ser tan sencilla. Uno de los casos más particulares, es cuando tenemos dos variables que se asignan a la misma estética, pero a las cuales le queremos asignar una escala diferente. Esto suele ocurrir, especialemente al trabajar con varias geometrías. Veamos un ejemplo.

msleep$vore <- as.factor(msleep$vore)
levels(msleep$vore) <- c("carnívoro", "herbívoro", "insectívoro", "omnívoro")

ggplot(msleep, aes(x = sleep_total, y = sleep_rem, color = vore)) +
  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
elartedeldato_colores <- c("#fffb00","#aedcc0", "#206999", "#ffab44", "#1b314b")

p +
  geom_point() +
  scale_color_manual(values = elartedeldato_colores)

Imaginemos que sobre estos puntos queremos trazar una línea de suavizado, con geom_smooth(), de un color ligeramente más oscuro a los puntos, para discernirla mejor. La librería shades permite modificar el brillo del color con la función brightness() muy fácilmente, pero veamos qué ocurre al añadirla.

library(shades)
p +
  geom_point() +
  scale_color_manual(values = elartedeldato_colores) +
  
  geom_smooth(se = F) +
  scale_color_manual(values = brightness(elartedeldato_colores, 0.5))

Si nos fijamos, ggplot toma la última escala de colores que se indique e ignora todas las anteriores. Entonces, ¿cómo podríamos asignar dos escalas diferentes a una misma estética como el color? La respuesta nos la da la librería ggnewscale. Esta librería permite redefinir la escala de color, fill, size, alpha, o cualquier otra estética que deseemos a través de la función new_scale_color().

library(ggnewscale)
p +
  geom_point() +
  scale_color_manual(values = elartedeldato_colores) +
  
  new_scale_color() +
  
  geom_smooth(aes(color = vore), se = F) +
  scale_color_manual(values = brightness(elartedeldato_colores, 0.5))

Recuerda que debes mapear de nuevo la variable que corresponda al color, ya que resetea por completo esta característica.

Para cualquier otra estética, simplemente utiliza new_scale("...") e indica el nombre la misma entre comillas.

En resumen…
  • geom_point(aes(shape=...)) para modificar la forma de los puntos

  • geom_point(aes(size=...)) para modificar el tamaño de los puntos

  • geom_point(aes(alpha=...)) para modificar la transparencia de los puntos

  • geom_point(stroke=0) para eliminar el borde de todos los puntos

  • Para resetear la escala de color utiliza new_scale_color()

  • Para cualquier otra estética utiliza new_scale('...') indicando el nombre de la estética (fill, alpha, size, etc)