Cómo personalizar el tema de un gráfico en ggplot

En el último post del Calendario de adviento 2021, vimos cómo modificar el tema de un gráfico en ggplot. Como sabemos, el tema nos sirve para personalizar las componentes ajenas a los datos de un gráfico, como puede ser, el título, fuente o el fondo del gráfico. Algunas de las funciones principales de ggplot relacionadas con el tema son:

  • theme() Permite modificar cualquier aspecto del tema actual del gráfico
  • theme_update() Permite modificar el tema activo y modifica todos los posteriores al mismo
  • theme_minimal() o cualquier otro tema por defecto, asigna ese nueva tema al gráfico
  • theme_set() Sobreescribe y actualiza el tema actual

Hoy nos centraremos en 3 de los aspectos más recurrentes de un tema: el color de fondo, la cuadrícula y el borde de un gráfico.

Cómo modificar el color de fondo de un tema de ggplot

library(ggplot2)
library(showtext)
font_add_google('Anton')

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)) +    
  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),
        strip.text=element_text(family='Anton', face='bold', size=14, hjust=0, color='white'),
        strip.background=element_rect(fill='black')) +
  facet_wrap('vore') -> p
p

Ggplot funciona por capas que se añaden con el símbolo +. Cada nueva capa sobreescribe la anterior por lo que si llamamos dos veces a la función theme() para un mismo argumento, ggplot tomará el útlimo que se haya definido.

Existen dos argumentos que modifican el fondo del gráfico. Uno es panel.background, que altera el fondo de cada uno de los paneles, y el otro, plot.background, que afecta a todo los demás.

yellow <- '#fffd80'
p  + theme(panel.background = element_rect(fill = 'white'),
           plot.background = element_rect(fill = yellow))

Como vemos, la leyenda es independiente del resto de elementos del tema. Para modificar el fondo de la leyenda utilizaremos legend.background.

p  + theme(panel.background = element_rect(fill = 'white'),
           plot.background = element_rect(fill = yellow),
           legend.background = element_rect(fill = yellow)) -> p
p

También es posible personalizar el color de fondo de las claves de la leyenda con legend.key.

p  + 
  theme(legend.key = element_rect(fill = yellow)) -> p
p

Cómo modificar las líneas de cuadrícula en ggplot

Las líneas de cuadrícula de fondo reciben el nombre de grid. Las funciones principales relacionadas con el grid son panel.grid.major y panel.grid.minor con sus respectivas opciones x e y, si queremos que afecta solamente a uno de los ejes.

En el plot anterior, las líneas quedaban ocultas por el color de fondo blanco. Podemos asignarles color amarillo de nuevo, al igual que el fondo, para que no pasen desapercibidas pero que tampoco destaquen frente a la información principal del gráfico.

p  + theme(panel.grid = element_line(color=yellow))

Cómo personalizar el borde de un gráfico en ggplot

Por último, vamos a ver cómo cambiar el borde de un gráfico.

De nuevo, diferenciamos cuando nos referimos al gráfico en sí, o bien a cada uno de los paneles. En el primer caso, recurrimos a plot.background con la opción element_rect(color=...).

Sin embargo, para modificar el borde del panel, utilizaremos panel.border = element_rect(color=...). Recordamos que es necesario añadir la opción fill=NA para no alterar el fondo de los paneles.

p  + theme(plot.background = element_rect(color="red", size=2),
           panel.border = element_rect(color = "blue", fill=NA, size = 2))

En resumen…

  • panel.background = element_rect(fill = …) modifica el fondo del panel

  • plot.background = element_rect(fill = …) modifica el fondo del gráfico

  • legend.background = element_rect(fill = …) modifica el fondo de la leyenda

  • legend.key = element_rect(fill = …) modifica el fondo de las claves de la leyenda

  • panel.grid = element_line(color=…) modifica el color de la cuadrícula

  • panel.border = element_rect(color = …) modifica el borde del panel

  • plot.background = element_rect(color=…) modifica el borde del gráfico

Paula L. Casado
Paula L. Casado
Data Scientist

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

Relacionado