Facetas

Uno de los aspectos fundamentos en un gráfico es poder dividirlo en paneles o facetas. Esta característica puede ser interesante cuando trabajamos con varias variables, donde alguna de ellas es categórica, y queremos comparar los datos en cada una de las categorías.

Cómo añadir facetas sobre una variable

Antes de nada 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())

A continuación, cargamos el plot base sobre el que aplicaremos las facetas. Elegiremos la misma variable que utilizamos anteriormente para mapear el color, véase la variable vore, que se refiere al género del animal, carnívoro, herbívoro o omnívoro.

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"
  ) -> p
p

La función facet_wrap() nos va a permitir dividir nuestro gráfico en paneles según la variable indicada como argumento.

p + facet_wrap(~vore)

Al tratarse de una variable también se puede indicar de la siguiente manera equivalente:

p + facet_wrap("vore")

Cómo añadir facetas sobre dos variables

Podemos ahora tratar de cruzar las facetas por dos variables categóricas, por ejemplo, el género y la conservación del animal.

p + facet_wrap(conservation ~ vore)

Como vemos, el cruce lleva a un resultado complicado de entender. Puede que con otros datos, pudiera ser interesante esta perspectiva, sin embargo, con los del ejemplo, quedaría más organizado si una de las variables definiese las filas de los paneles, y la otra, las columnas. Eso es posible con la función facet_grid().

p + facet_grid(conservation ~ vore)

O bien, de igual manera,

p + facet_grid(rows = vars(conservation), cols = vars(vore))

Cómo modificar la escala de los ejes de las facetas

Aunque existen diferentes opciones para personalizar las facetas, uno de los aspectos más relevantes es la escala de los ejes de las facetas. Ésto se puede hacer a través del argumento scales.

p + facet_grid(conservation ~ vore, scales = "free")

Utilizaríamos 'free', para indicar que ambos ejes tendrán escalas libres, o bien, 'free_x' o 'free_y' para dejar libres las escalas entre facetas del eje x o y respectivamente. Recuerda siempre de que el valor del argumento va entre comillas ;)

Cómo modificar los títulos de las facetas

Ahora veremos cómo modificar los títulos de las facetas puesto que no es una tarea trivial, especialmente cuando se trata de añadir expresiones matemáticas a las mismas.

Para modificar aspectos específicos del estilo de los títulos, debemos recurrir la funcióntheme(). En este caso, strip.text y strip.background, nos permitirán jugar con los aspectos estéticos del los títulos de cada faceta.

p +
  facet_wrap("vore") +
  theme(
    strip.text = element_text(hjust = 0.5, color = "black"),
    strip.background = element_rect(fill = "white", color = "black")
  )

Tip

Para añadir fuentes de Google en el tema de ggplot puedes volver a leer el capítulo sobre temas.

Cómo añadir expresiones matemáticas a los títulos de las facetas

Para añadir expresiones matemáticas, como letras griegas, en los títulos de las facetas, no es tan sencillo como vimos anteriormente en el título principal o los de los ejes. Ahora, debemos tener la expresión en forma de texto en el propio dato y parsearla dentro de la función facet_wrap/facet_grid, con labeller=label_parser.

A modo de ejemplo, crearemos una nueva variable, sobre la que añadiremos una expresión matemática (a pesar de que para estos datos no tiene sentido).

msleep$new_vore <- as.factor(msleep$vore)
levels(msleep$new_vore)[1] <- "x^y/betaintegral(f(x)*dx, a, b)"

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("new_vore", labeller = label_parsed)

En resumen
  • facet_wrap() para construir paneles a partir de una variable
  • facet_grid() para distribuirlos de forma regular (filas y columnas)
  • theme(strip.text = element_text(...), strip.background = element_rect(...)) para personalizar los títulos de las facetas
  • facet_wrap(labeller = label_parsed) para añadir expresiones matemáticas a los títulos de las facetas