Edición de texto avanzada

Uno de los elementos más importantes de una visualización es el texto que se incluye en ella. En ggplot, podemos añadir texto a través del título, pie de gráfico, etiquetas, a través de anotaciones, etc pero a veces es difícil destacar sólo una parte concreta o personalizarlo de forma avanzada. Aquí veremos cómo editar el estilo de texto en ggplot nivel pro. ¡Vamos a ello!

Cómo editar el estilo de texto en ggplot

Utilizaremos la visualización del último capítulo donde hablábamos de cómo evitar el solapamiento del texto en ggplot. En ella, representábamos el año de estreno de una película en Netflix frente a su duración en minutos, con etiquetas del top 3 de títulos de mayor y menor duración.

library(tidyverse)
library(lubridate)
library(ggrepel)

df <- read.csv("https://raw.githubusercontent.com/elartedeldato/datasets/main/netflix_titles.csv")
df %>%
  filter(str_detect(description, "high school"), type == "Movie") %>%
  mutate(duration := as.numeric(str_remove(duration, " min"))) %>%
  select(release_year, duration, title) -> df_title

df_title %>%
  mutate(top_duration := rank(desc(duration))) -> df_title

ggplot(df_title) +
  geom_point(aes(x = release_year, y = duration), color = "red") +
  labs(
    title = "Netflix",
    subtitle = "Duración de las películas sobre High School por año de estreno",
    caption = "Fuente: Kaggle. elartedeldato.com",
    x = "Año de estreno", y = "Duración en min"
  ) +
  geom_text_repel(
    data = subset(
      df_title,
      top_duration <= 3 | top_duration >= 78
    ),
    aes(x = release_year, y = duration, label = title),
    family = "Permanent Marker", size = 4, color = "white", box.padding = 0.6
  ) -> p
p

Cómo destacar una palabra dentro de un título

Imaginemos que quisiéramos destacar la palabra High School del subtítulo, por tratarse de un elemento esencial de la frase. Podría hacerse añadiendo anotaciones con partes de la frase, intentar pegarlas entre sí y colocarlas en el lugar del subtítulo. Sin duda, sería una solución, pero desde luego poco elegante y no las más eficiente. Entonces, ¿cuál es la forma más sencilla para hacerlo?

Con la librería ggtext. Esta librería contiene dos funciones principales: element_markdown() y element_textbox_simple() que permiten editar el estilo de texto con html y css y aumentará un grado de complejidad a nuestras visualizaciones.

library(ggtext)
p +
  labs(subtitle = 'Duración de las películas sobre <span style="color: red;">High School</span> por año de estreno') +
  theme(plot.subtitle = element_markdown(family = "PermanentMarker-Regular", size = 10, color = "white"))

Este recurso es muy común, por ejemplo, cuando trabajamos con la estética del color y queremos evitar la leyenda. En el propio subtítulo se puede añadir una explicación de las distintas categorías de la variable y al nombrarlas se aplican los correspondientes colores asociados.

Cómo añadir una caja de texto

Por otro lado, también puede ser de interés añadir una caja que encierre el título o el subtítulo, por ejemplo.

ggtext proporciona la función element_textbox_simple() con parámetros como el padding, margen o ancho del borde que nos permitirán editar la caja de texto fácilmente.

p +
  labs(subtitle = 'Duración de las películas sobre <span style="color: red;">High School</span> por año de estreno') +
  theme(plot.subtitle = element_textbox_simple(
    family = "Permanent Marker", size = 10, color = "white",
    lineheight = 1,
    linetype = 1, # turn on border
    box.color = "red", # border color
    fill = "black", # background fill color
    r = grid::unit(0, "pt"), # radius for rounded corners
    padding = margin(20, 20, 20, 20), # padding around text inside the box
    margin = margin(0, 0, 10, 0) # margin outside the box
  ))

Nota

Para más información puedes visitar la web de ggtext: https://cran.r-project.org/web/packages/ggtext/vignettes/theme_elements.html

En resumen
  • Utilizamos element_markdown() para editar el texto con formato html

  • Utilizamos element_textbox_simple() para crear una caja de texto sobre el título o subtítulo

:::