Tema

En ggplot, existen numerosos temas por defecto para elegir. Sobre todos ellos, se pueden ir haciendo modificaciones a nuestro gusto o preferencia e incluso guardarlos para utilizarlos posteriormente.

En esta sección veremos qué temas por defecto nos ofrece ggplot2, cómo modificar un tema y otros temas proporcionados por librerías extras.

Temas de ggplot2

Una de las características de ggplot es el famoso fondo gris y líneas de cuadrícula blancas que permite discernir los elementos del plano fácilmente. Su nombre es theme_gray() y si no se indica ningún otro, será el tema que se asigne por defecto, pero si este no es tu favorito, no te preocupes, existen muchos otros.

Para esta sección crearemos nuestro gráfico base que nos servirá para seguir el contenido de forma más sencilla.

library(ggplot2)

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. elartedeldato.com",
    x = "Horas de sueño en total", y = "Horas de sueño en fase REM"
  ) -> p
p

Un ejemplo de tema diferentes es theme_minimal(), claro y minimalista.

p + theme_minimal()

Esta es la lista completo de temas que podemos aplicar sin necesidad de instalar otras librerías:

  • theme_bw(). El tema clásico de ggplot2 con fondo oscuro. Puede funcionar mejor para presentaciones mostradas con un proyector.

  • theme_linedraw(). Un tema con sólo líneas negras de varios anchos sobre fondos blancos, que recuerda a un dibujo de líneas. Tiene un propósito similar a theme_bw(). Tenga en cuenta que este tema tiene algunas líneas muy finas (<< 1 pt) que algunas revistas pueden rechazar.

  • theme_light(). Un tema similar a theme_linedraw() pero con líneas y ejes de color gris claro, para dirigir más la atención hacia los datos.

  • theme_dark(). El primo oscuro de theme_light(), con tamaños de línea similares pero con un fondo oscuro. Es útil para hacer que las líneas finas de color resalten.

  • theme_minimal(). Un tema minimalista sin anotaciones de fondo.

  • theme_classic(). Un tema de aspecto clásico, con líneas en los ejes X e Y y sin líneas de cuadrícula.

  • theme_void(). Un tema completamente vacío.

  • theme_test(). Un tema para las pruebas unitarias visuales. Idealmente no debería cambiar nunca, excepto por las nuevas características.

Con la función theme_set(), podríamos por defecto configurar un tema para todos los gráficos de ggplot del proyecto sin necesidad de llamar continuamente a la función theme().

theme_set(theme_minimal())

p

Cómo personalizar un tema de ggplot

En realidad, ya hemos visto en anteriores capítulos cómo modificar algunos componentes del tema de un gráfico en ggplot2. Simplemente utilizamos la función theme() y sobre ella, podemos modificar cualquier aspecto relacionado con el estilo del gráfico que no esté relacionado con los datos: ejes, leyenda, color de fondo, cuadrícula, etc.

Nota

Para saber más sobre todos los aspectos que se pueden modificar puedes consultar la documentación oficial de ggplot2.

Algunas de las funciones principales 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() Sobrescribe y actualiza el tema actual

A continuación, crearemos un tema específico para El arte del dato bien contado y lo guardaremos en la función theme_elartedeldato() para poder reutilizarlo en cualquier ocasión.

Nota

Puedes echar un vistazo a los elementos que se modifican del tema. En las próximas secciones de esta guía, iremos especificando cómo personalizar cada uno de ellos.

library(showtext)

font_add_google("Bebas Neue")
font_add_google("Roboto")

showtext_auto()

theme_elartedeldato <- function() {
  titles_font_family <- "Bebas Neue"
  base_font_family <- "Roboto"

  theme_minimal() +
    theme(
      # Leyenda
      legend.position = "bottom",
      legend.text = element_text(family = base_font_family),
      legend.title = element_text(family = titles_font_family),

      # Grid
      panel.grid.major = element_line(linewidth = 0.25, color = "#F3F3F3"),
      panel.grid.major.x = element_blank(),
      panel.grid.minor = element_blank(),
      panel.spacing = unit(0.75, "lines"),
      panel.background = element_rect(fill = "transparent", color = "transparent"),

      # Ejes
      axis.title = element_text(family = titles_font_family),
      axis.text = element_text(family = base_font_family),

      # Facetas
      strip.text = element_text(family = titles_font_family, hjust = 0, color = "white", size = 12),
      strip.background = element_rect(fill = "black"),

      # Texto
      text = element_text(family = base_font_family, size = 10, color = "black"),

      # Aspectos principales
      plot.title = element_text(family = titles_font_family, size = 30),
      plot.subtitle = element_text(family = titles_font_family, color = "#8a8a8a", size = 15),
      plot.caption = element_text(family = titles_font_family),
      plot.background = element_rect(fill = "transparent", color = "transparent")
    )
}
Advertencia

Si te aparece este error al añadir una fuente de texto nueva:

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)

Puedes solucionarlo llamando a la función: showtext_auto().

Otros temas extra para ggplot

Existen otras librerías extra que nos permiten modificar el tema en un gráfico de ggplot2. Algunas de las más interesantes son las siguientes:

  • Tema de Economist en ggplot. Este tema pertenece a la librería ggthemes. Una librería simple, con temas básicos, entre ellos muy interesante, como el de la revista Economist.
library(ggthemes)

p + theme_economist()

  • Para los amantes de la tipografía, hrbrthemes. Esta librería se centra en el uso de la Arial Narrow, dando un aspecto elegante y sofisticado a cualquier gráfico.
# remotes::install_github("hrbrmstr/hrbrthemes")
library(hrbrthemes)

p + theme_ipsum()

  • ggdark otra opción simple que permite transformar los plot de ggplot a tonos oscuros.
library(ggdark)

p + dark_theme_gray()

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

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 último que se haya definido.

El fondo de un gráfico se puede modificar a través de plot.background. Existe otro argumento similar, panel.background, que altera el fondo de las facetas, otro elemento de ggplot que veremos en capítulos posteriores.

light_color <- "#fbe5c5"

p + theme(
  plot.background = element_rect(fill = light_color, color = light_color)
)

Por otro lado, para modificar el fondo de la leyenda utilizaremos legend.background, ya que es un elemento que requiere personalizarse de forma independiente.

p + theme(
  legend.background = element_rect(fill = light_color, color = light_color)
)

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 = light_color, color = light_color)
)

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 = "orange")
)

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.

blue <- "#216593"

p + theme(
  plot.background = element_rect(color = "orange", 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