library(ggplot2)
$vore <- as.factor(msleep$vore)
msleeplevels(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
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.
Un ejemplo de tema diferentes es theme_minimal()
, claro y minimalista.
+ theme_minimal() p
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 atheme_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 atheme_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 detheme_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.
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áficotheme_update()
Permite modificar el tema activo y modifica todos los posteriores al mismotheme_minimal()
o cualquier otro tema por defecto, asigna ese nueva tema al gráficotheme_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.
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()
<- function() {
theme_elartedeldato <- "Bebas Neue"
titles_font_family <- "Roboto"
base_font_family
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")
) }
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)
+ theme_economist() p
- 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)
+ theme_ipsum() p
ggdark
otra opción simple que permite transformar los plot de ggplot a tonos oscuros.
library(ggdark)
+ dark_theme_gray() p
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.
<- "#fbe5c5"
light_color
+ theme(
p 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.
+ theme(
p 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
.
+ theme(
p 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.
+ theme(
p 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.
<- "#216593"
blue
+ theme(
p plot.background = element_rect(color = "orange", size = 2),
panel.border = element_rect(color = blue, fill = NA, size = 2)
)
panel.background = element_rect(fill = ...)
modifica el fondo del panelplot.background = element_rect(fill = ...)
modifica el fondo del gráficolegend.background = element_rect(fill = ...)
modifica el fondo de la leyendalegend.key = element_rect(fill = ...)
modifica el fondo de las claves de la leyendapanel.grid = element_line(color=...)
modifica el color de la cuadrículapanel.border = element_rect(color = ...)
modifica el borde del panelplot.background = element_rect(color=...)
modifica el borde del gráfico