Notas de Clase - 2
Introducción a la Visualización de Datos con R
Clase 2: Capas en ggplot2, Themes y Escalas
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 ocupados por año (ESTADO == 1)
<- df_eph %>%
tbl_desocup_2020_25 filter(ESTADO == 1) %>%
count(ANO4) %>%
rename("Anio" = "ANO4")
# Crear tabla para subconjunto 2022-2025
<- df_eph %>%
tbl_desocup_2022_25 filter(ESTADO == 1, ANO4 %in% 2022:2025) %>%
count(ANO4) %>%
rename("Anio" = "ANO4")
1. Superposición de Geometrías
1.1 Múltiples Geometrías en un Solo Gráfico
Una característica poderosa de ggplot2 es la capacidad de superponer diferentes geometrías:
ggplot(
data = tbl_desocup_2020_25,
mapping = aes(x = Anio, y = n)
+
) geom_col() + # Barras
geom_line() + # Línea
geom_point() # Puntos
Explicación: Cada geom_*()
agrega una nueva capa visual al mismo gráfico. El orden importa: las capas se superponen según el orden de aparición en el código.
2. Uso de Datasets Diferentes por Geometría
2.1 Especificando Data por Geometría
Podemos usar diferentes conjuntos de datos para cada geometría:
ggplot(mapping = aes(x = Anio, y = n, fill = as.factor(Anio))) +
geom_line(data = tbl_desocup_2020_25) + # Dataset completo
geom_col(data = tbl_desocup_2022_25) + # Subset 2022-2025
geom_point(data = tbl_desocup_2022_25 %>% # Solo 2024
filter(Anio == 2024))
Conceptos clave: - mapping
se especifica en ggplot()
para que sea heredado por todas las geometrías - Cada geometría puede usar un dataset diferente con el parámetro data
- Los aesthetics se mantienen consistentes entre capas
2.2 Verificando Datos Filtrados
Siempre es buena práctica verificar los datos que estamos utilizando:
# Verificar qué contiene nuestro filtro de 2024
%>%
tbl_desocup_2022_25 filter(Anio == 2024)
3. Separando Data y Mapping
3.1 Construcción Paso a Paso
Una aproximación más explícita es especificar data y mapping para cada geometría:
ggplot() +
geom_line(
data = tbl_desocup_2020_25,
mapping = aes(x = Anio, y = n)
+
) labs(fill = "Años") +
ylim(c(0, max(tbl_desocup_2020_25$n))) + # Límites dinámicos
xlim(2019, 2026) # Límites fijos
Ventajas: - Mayor control sobre cada elemento - Fácil debugging cuando algo no funciona - Claridad sobre qué datos usa cada geometría
4. Escalas de Variables Categóricas
4.1 Transformando Variables Continuas a Categóricas
Para mejor control de etiquetas, podemos tratar años como factores:
ggplot(tbl_desocup_2020_25, aes(x = factor(Anio), y = n)) +
geom_col(fill = "#4F7CFF") +
scale_x_discrete(
labels = paste0("Año ", tbl_desocup_2020_25$Anio) # Etiquetas personalizadas
+
) labs(x = "Año") +
theme_minimal()
Conceptos importantes: - factor(Anio)
: Convierte números a categorías - scale_x_discrete()
: Controla escalas de variables categóricas - paste0()
: Crea etiquetas dinámicas concatenando texto
5. Escalas de Color
5.1 Paletas de Colores Continuas
library(RColorBrewer) # Para paletas de colores adicionales
ggplot(tbl_desocup_2020_25, aes(x = Anio, y = n, fill = Anio)) +
geom_col() +
scale_fill_viridis_c() + # Paleta viridis para variables continuas
theme_minimal() +
guides(fill = "none") # Ocultar leyenda
Paletas disponibles: - scale_fill_viridis_c()
: Paleta viridis (buena para accesibilidad) - scale_fill_gradient()
: Gradiente personalizable - Paletas de RColorBrewer: scale_fill_brewer()
6. Trabajando con Datos Reales de la EPH
6.1 Explorando la Estructura de Datos
# Verificar las columnas disponibles
colnames(df_eph)
6.2 Descarga Directa con el Paquete eph
library(eph)
# Descargar microdatos de la EPH
<- get_microdata(
df_eph year = 2020:2023,
period = 3, # Tercer trimestre
vars = c("ANO4", "AGLOMERADO", "ESTADO")
)
Explicación: - get_microdata()
: Función del paquete eph para descargar datos oficiales - year
: Años a descargar - period
: Trimestre (1-4) - vars
: Variables específicas a incluir
6.3 Análisis por Aglomerado
# Crear tabla por aglomerado y estado laboral
<- df_eph |>
df_por_aglo filter(ESTADO %in% c(1, 2)) |> # Solo ocupados (1) y desocupados (2)
count(AGLOMERADO, ANO4, ESTADO, name = "cantidad")
# Calcular porcentajes
<- df_por_aglo %>%
df_por_aglo_porc group_by(AGLOMERADO, ANO4) %>%
mutate(porcentaje = cantidad / sum(cantidad) * 100)
Conceptos clave: - filter(ESTADO %in% c(1, 2))
: Filtrar múltiples valores - count(..., name = "cantidad")
: Contar observaciones con nombre personalizado - group_by()
+ mutate()
: Cálculos por grupos
7. Visualización con Facetas
7.1 Gráficos Múltiples por Categoría
%>%
df_por_aglo_porc filter(AGLOMERADO %in% 1:10) %>% # Primeros 10 aglomerados
ggplot(aes(x = ANO4, y = porcentaje)) +
geom_line(aes(color = factor(AGLOMERADO)), size = 1.2) +
facet_wrap(facet = "ESTADO") + # Separar por estado laboral
theme_minimal()
Conceptos nuevos: - facet_wrap()
: Crear múltiples paneles basados en una variable - aes(color = factor())
: Asignar colores por categoría - Filtrado con %in%
: Seleccionar múltiples valores
Parámetros de facet_wrap(): - facet = "VARIABLE"
: Variable para crear facetas - ncol = n
: Número de columnas - scales = "free"
: Escalas independientes por faceta
Conceptos Clave para Recordar
- Superposición de capas: Cada
geom_*()
agrega una nueva capa visual - Data específica por geometría: Puedes usar diferentes datasets para cada capa
- Construcción explícita: Separar data y mapping da mayor control
- Variables categóricas: Usar
factor()
yscale_x_discrete()
para mejor control de etiquetas - Paletas de colores:
scale_fill_viridis_c()
y otras opciones para escalas continuas - Datos reales: El paquete
eph
facilita el trabajo con microdatos oficiales - Facetas:
facet_wrap()
para dividir gráficos por categorías - Filtrado avanzado:
%in%
para seleccionar múltiples valores
Buenas Prácticas
Verificación de Datos
# Siempre verificar los datos filtrados
%>% filter(Anio == 2024)
tbl_desocup_2022_25
# Explorar la estructura de datos nuevos
colnames(df_eph)
Orden de Capas
- Las capas se superponen según el orden en el código
- Colocar elementos de fondo primero, detalles al final
Escalas Dinámicas
ylim(c(0, max(datos$variable))) # Límites basados en los datos
Trabajando con Grupos
# Patrón común: filter -> group_by -> mutate/summarise
%>%
datos filter(condicion) %>%
group_by(variable_agrupacion) %>%
mutate(nueva_variable = calculo)
Flujo de Trabajo Recomendado
- Explorar los datos:
colnames()
,head()
,summary()
- Filtrar y transformar: Crear subconjuntos relevantes
- Construir gráfico básico: Una geometría a la vez
- Agregar capas: Superponer según necesidad
- Ajustar escalas: Colores, etiquetas, límites
- Aplicar facetas: Si hay múltiples categorías a comparar
Ejercicios Sugeridos
- Crear un gráfico que combine líneas y barras usando diferentes subconjuntos de datos
- Experimentar con diferentes paletas de colores continuas
- Crear facetas por diferentes variables categóricas
- Descargar datos de la EPH para otros períodos y crear visualizaciones comparativas
- Combinar filtros complejos con visualizaciones por aglomerado
- Explorar el efecto del orden de las capas en la visualización final
Recursos Adicionales
- Paquete eph: Para trabajar con datos oficiales de empleo
- RColorBrewer: Paletas de colores especializadas
- Documentación de ggplot2: Para explorar más opciones de escalas y facetas
- Cheat sheet de ggplot2: Referencia rápida de funciones
Glosario de Funciones
geom_col()
: Gráfico de barrasgeom_line()
: Gráfico de líneasgeom_point()
: Gráfico de puntosfactor()
: Convierte variable a categóricascale_x_discrete()
: Controla escala de variable categóricascale_fill_viridis_c()
: Paleta de colores continuafacet_wrap()
: Múltiples paneles por categoríaguides()
: Control de leyendasxlim()
/ylim()
: Límites de ejes
Notas de la Clase 3 - Curso “Introducción a la Visualización de Datos con R”