Notas de Clase - 3

Author

Estación R

Introducción a la Visualización de Datos con R

Clase 2: Agregando Texto y Anotaciones a los Gráficos

Preparación de los datos

Comenzamos cargando las librerías necesarias y preparando nuestros datos de ejemplo:

library(tidyverse)

# Cargar datos
df_eph <- read.csv("datos/base_practica.csv")

# Crear tabla de desocupados por año
tbl_desocup_2020_25 <- df_eph %>%
  filter(ESTADO == 2) %>%
  count(ANO4, ESTADO)

1. Agregando Texto con geom_text()

1.1 Texto Manual (Posición Fija)

Podemos agregar texto en posiciones específicas del gráfico:

tbl_desocup_2020_25 %>%
  ggplot(aes(x = ANO4, y = n)) +
  geom_col() +
  geom_text(x = 2021, y = 1700, label = "HOLA MUNDO")

Explicación: Los parámetros x e y definen la posición exacta donde aparecerá el texto.

1.2 Texto Dinámico (Basado en los Datos)

Más útil es vincular el texto a los datos usando aesthetics:

tbl_desocup_2020_25 %>%
  ggplot(aes(x = ANO4, y = n)) +
  geom_col() +
  geom_text(aes(label = n))

Explicación: aes(label = n) toma automáticamente los valores de la variable n para mostrar como etiquetas.

1.3 Combinando Texto Manual y Dinámico

tbl_desocup_2020_25 %>%
  ggplot(aes(x = ANO4, y = n)) +
  geom_col() +
  geom_text(aes(label = n)) +
  geom_text(
    x = 2020,
    y = 400,
    label = "Cant. Desocupados",
    angle = 90  # Rotar el texto 90 grados
  )

2. Texto Inteligente Basado en Cálculos

2.1 Posicionamiento Automático

Podemos calcular posiciones óptimas para el texto:

# Encontrar el año con menor desocupación
text_anio_min <- tbl_desocup_2020_25 %>%
  filter(n == min(n)) %>%
  pull(ANO4)

# Usar esa posición para el texto
tbl_desocup_2020_25 %>%
  ggplot(aes(x = ANO4, y = n)) +
  geom_col() +
  geom_text(aes(label = n)) +
  geom_text(
    x = text_anio_min,  # Posición calculada
    y = 400,
    label = "Cant. Desocupados",
    angle = 90
  )

2.2 Filtrado de Datos para Subconjuntos

# Crear subset de datos (2021-2025)
tbl_desocup_2021_25 <- df_eph %>%
  filter(ANO4 > 2020) %>%
  filter(ESTADO == 2) %>%
  count(ANO4, ESTADO)

# Aplicar la misma lógica al subconjunto
text_anio_min <- tbl_desocup_2021_25 %>%
  filter(ANO4 == min(ANO4)) %>%
  pull(ANO4)

tbl_desocup_2021_25 %>%
  ggplot(aes(x = ANO4, y = n)) +
  geom_col() +
  geom_text(aes(label = n)) +
  geom_text(
    x = text_anio_min,
    y = 400,
    label = "Cant. Desocupados",
    angle = 90
  )

3. geom_label(): Texto con Fondo

Para mayor legibilidad, usamos geom_label() que agrega un fondo a las etiquetas:

tbl_desocup_2020_25 %>%
  ggplot(aes(x = ANO4, y = n)) +
  geom_col() +
  geom_label(
    aes(label = n),
    fill = "green",           # Color de fondo
    color = "white",          # Color del texto
    fontface = "bold",        # Tipo de letra
    family = "arial",         # Familia de fuente
    label.padding = unit(0.5, "lines")  # Espacio interno
  )

4. Alineación de Texto: vjust y hjust

Control preciso de la posición del texto:

ggplot(tbl_desocup_2020_25, aes(x = ANO4, y = n)) +
  geom_col(fill = "#4F7CFF") +
  geom_label(
    aes(label = n),
    vjust = "inward",    # Alineación vertical hacia adentro
    hjust = 0.5,         # Alineación horizontal centrada
    color = "black",
    size = 4,
    fontface = "bold"
  )

Conceptos clave: - vjust: Controla alineación vertical (0 = abajo, 0.5 = centro, 1 = arriba) - hjust: Controla alineación horizontal (0 = izquierda, 0.5 = centro, 1 = derecha) - "inward": Automáticamente hacia adentro del gráfico


5. annotate(): Anotaciones Flexibles

5.1 Anotaciones de Texto

Para agregar texto explicativo sin vincularlo a los datos:

ggplot(tbl_desocup_2020_25, aes(x = ANO4, y = n)) +
  geom_line(color = "#4F7CFF", size = 1.5) +
  geom_point(color = "#4F7CFF", size = 3) +
  annotate(
    "text",
    x = 2022,
    y = min(tbl_desocup_2020_25$n),
    vjust = -1,
    label = "Pico histórico\n2023",  # \n para salto de línea
    size = 4,
    color = "red",
    fontface = "italic"
  ) +
  theme_minimal()

5.2 Anotaciones con Formas Geométricas

Agregar rectángulos para destacar períodos:

ggplot(tbl_desocup_2020_25, aes(x = ANO4, y = n)) +
  ylim(c(0, 3000)) +
  
  # Rectángulo para período 1
  annotate(
    "rect",
    xmin = 2021, xmax = 2022,
    ymin = 1000, ymax = 2000,
    alpha = 0.5,          # Transparencia
    fill = "darkgrey",
    color = "black",
    linetype = 4          # Línea punteada
  ) +
  
  # Rectángulo para período 2
  annotate(
    "rect",
    xmin = 2020, xmax = 2022,
    ymin = 1000, ymax = 2000,
    alpha = 0.5,
    fill = "blue",
    color = "black",
    linetype = 4
  ) +
  
  # Agregar línea y puntos
  geom_line(color = "black", size = 1.5) +
  geom_point(color = "#4F7CFF", size = 3) +
  
  # Etiquetas para los rectángulos
  annotate("text", x = 2021.5, y = 2050, label = "Presidencia 2", size = 4) +
  annotate("text", x = 2020.5, y = 2050, label = "Presidencia 1", size = 4) +
  
  theme_minimal()

6. Librerías Especializadas para Texto

6.1 ggrepel: Evitar Superposición de Etiquetas

library(ggrepel)

ggplot(mtcars, aes(x = disp, y = hp)) +
  geom_point(size = 4, color = "#4F7CFF") +
  geom_text_repel(
    aes(label = rownames(mtcars))  # Automáticamente evita superposiciones
  ) +
  theme_minimal()

Ventaja: Las etiquetas se reposicionan automáticamente para evitar solapamientos.

6.2 geomtextpath: Texto a lo Largo de Líneas

library(geomtextpath)

ggplot(data = tbl_desocup_2020_25, aes(x = ANO4, y = n)) +
  geom_textline(
    label = "Desocupados",
    vjust = -0.5, 
    hjust = 1
  )

Uso: Ideal para etiquetar líneas directamente sobre ellas.


7. Gráficos Interactivos con plotly

7.1 Conversión Básica

library(plotly)

# Crear gráfico base
viz_1 <- ggplot(tbl_desocup_2020_25, aes(x = ANO4, y = n)) +
  geom_line(color = "#4F7CFF", size = 1.5) +
  geom_point(color = "#4F7CFF", size = 3) +
  annotate(
    "text",
    x = 2022,
    y = min(tbl_desocup_2020_25$n),
    vjust = -1,
    label = "Pico histórico\n2023",
    size = 4,
    color = "red",
    fontface = "italic"
  ) +
  theme_minimal()

# Convertir a interactivo
ggplotly(viz_1)

7.2 Tooltips Personalizados

Para mayor control sobre la información que se muestra al pasar el cursor:

p <- ggplot(
  tbl_desocup_2020_25,
  aes(
    x = ANO4,
    y = n,
    text = paste(                    # Tooltip personalizado
      "Año:", ANO4,
      "<br>Desocupados:", scales::comma(n),
      "<br>Período: 2020-2025"
    )
  )
) +
  geom_line(color = "#4F7CFF", size = 1.5) +
  geom_point(color = "#4F7CFF", size = 4) +
  theme_minimal() +
  labs(
    title = "Desocupación con tooltips personalizados",
    x = "Año",
    y = "Desocupados"
  )

# Especificar que use solo nuestro tooltip
ggplotly(p, tooltip = "text")

Conceptos Clave para Recordar

  1. geom_text() vs geom_label(): El segundo incluye fondo para mejor legibilidad
  2. Posicionamiento manual vs automático: Usar cálculos para posiciones dinámicas
  3. annotate(): Para elementos que no dependen directamente de los datos
  4. vjust/hjust: Control preciso de alineación
  5. ggrepel: Solución automática para evitar superposición de texto
  6. plotly: Agregar interactividad fácilmente a gráficos ggplot

Ejercicios Sugeridos

  1. Crear un gráfico de barras con etiquetas de valores centradas
  2. Agregar anotaciones explicativas usando annotate() con formas geométricas
  3. Experimentar con diferentes posiciones usando vjust y hjust
  4. Convertir un gráfico complejo a interactivo con tooltips personalizados

Notas de la Clase 2 - Curso “Introducción a la Visualización de Datos con R”