Notas de Clase - 3
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
<- read.csv("datos/base_practica.csv")
df_eph
# Crear tabla de desocupados por año
<- df_eph %>%
tbl_desocup_2020_25 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
<- tbl_desocup_2020_25 %>%
text_anio_min 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)
<- df_eph %>%
tbl_desocup_2021_25 filter(ANO4 > 2020) %>%
filter(ESTADO == 2) %>%
count(ANO4, ESTADO)
# Aplicar la misma lógica al subconjunto
<- tbl_desocup_2021_25 %>%
text_anio_min 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
<- ggplot(tbl_desocup_2020_25, aes(x = ANO4, y = n)) +
viz_1 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:
<- ggplot(
p
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
- geom_text() vs geom_label(): El segundo incluye fondo para mejor legibilidad
- Posicionamiento manual vs automático: Usar cálculos para posiciones dinámicas
- annotate(): Para elementos que no dependen directamente de los datos
- vjust/hjust: Control preciso de alineación
- ggrepel: Solución automática para evitar superposición de texto
- plotly: Agregar interactividad fácilmente a gráficos ggplot
Ejercicios Sugeridos
- Crear un gráfico de barras con etiquetas de valores centradas
- Agregar anotaciones explicativas usando
annotate()
con formas geométricas - Experimentar con diferentes posiciones usando
vjust
yhjust
- 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”