Cómo añadir facetas en ggplot2

Hasta ahora hemos trabajado con el título principal y los títulos de los ejes, pero más allá del texto, existen otros aspectos primordiales en un gráfico interesantes, como saber dividir el gráfico 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.

library(ggplot2)
library(reactable)
reactable(head(msleep))

Podemos utilizar para las facetas la misma variable con la que mapeamos con anterioridad 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',
       x='Horas de sueño en total', y='Horas de sueño en fase REM') + 
  theme(plot.title=element_text(family='Anton', size=20),
        plot.subtitle=element_text(family='Anton'),
        axis.title.x = element_text(family='Anton', face='bold', hjust=1),
        axis.title.y = element_text(family='Anton', face='bold', hjust=1)) -> 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')

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 ;)

Paula L. Casado
Paula L. Casado
Data Scientist

Científica de datos especializada en visualización de datos.

Relacionado