R
Tutorial R: Facetas en ggplot2
Aprende a crear visualizaciones con facetas en ggplot2 usando facet_wrap y facet_grid para analizar datos categóricos en R.
Aprende R y certifícatefacet_wrap() para paneles por una variable
Cuando analizamos datos, a menudo necesitamos comparar cómo se comporta una variable a través de diferentes categorías o grupos. En lugar de crear múltiples gráficos separados, ggplot2 nos ofrece una solución elegante mediante las facetas, que dividen automáticamente nuestra visualización en múltiples paneles.
La función facet_wrap()
es la forma más sencilla de crear paneles en ggplot2, especialmente cuando queremos dividir nuestros datos según los valores de una variable categórica. Esta función toma los distintos valores de la variable y crea un panel separado para cada uno, organizándolos en una disposición de filas y columnas.
Sintaxis básica
La sintaxis básica de facet_wrap()
es muy simple:
ggplot(datos, aes(x = variable_x, y = variable_y)) +
geom_punto() +
facet_wrap(~ variable_faceta)
El elemento clave aquí es la fórmula ~ variable_faceta
, donde el símbolo ~
indica que estamos especificando una variable para el facetado.
Ejemplo práctico
Veamos un ejemplo utilizando el conjunto de datos mpg
que viene incluido en ggplot2:
library(ggplot2)
# Crear un gráfico de dispersión con facetas por tipo de vehículo
ggplot(mpg, aes(x = displ, y = hwy)) +
geom_point() +
facet_wrap(~ class) +
labs(title = "Relación entre tamaño del motor y consumo en carretera",
x = "Cilindrada (litros)",
y = "Millas por galón en carretera",
caption = "Fuente: datos mpg de ggplot2")
En este ejemplo, estamos visualizando la relación entre el tamaño del motor (displ
) y el consumo de combustible en carretera (hwy
), pero dividiendo los datos en paneles según el tipo de vehículo (class
). Esto nos permite ver rápidamente cómo varía esta relación entre diferentes categorías de vehículos.
Controlando la disposición de los paneles
Por defecto, facet_wrap()
intenta crear una disposición aproximadamente cuadrada de paneles. Sin embargo, podemos controlar específicamente cuántas filas o columnas queremos:
# Organizar los paneles en 2 filas
ggplot(mpg, aes(x = displ, y = hwy)) +
geom_point() +
facet_wrap(~ class, nrow = 2)
# Organizar los paneles en 3 columnas
ggplot(mpg, aes(x = displ, y = hwy)) +
geom_point() +
facet_wrap(~ class, ncol = 3)
Esta flexibilidad es útil cuando necesitamos adaptar nuestras visualizaciones a diferentes formatos de presentación o cuando queremos enfatizar comparaciones específicas entre paneles.
Escalas compartidas vs. independientes
Por defecto, todos los paneles comparten las mismas escalas en los ejes x e y, lo que facilita la comparación directa entre grupos. Sin embargo, a veces necesitamos que cada panel tenga su propia escala para ver mejor los patrones dentro de cada grupo:
# Permitir escalas independientes en el eje y
ggplot(mpg, aes(x = displ, y = hwy)) +
geom_point() +
facet_wrap(~ class, scales = "free_y")
# Permitir escalas independientes en ambos ejes
ggplot(mpg, aes(x = displ, y = hwy)) +
geom_point() +
facet_wrap(~ class, scales = "free")
Las opciones para el parámetro scales
son:
"fixed"
: escalas iguales en todos los paneles (predeterminado)"free_x"
: permite que el eje x varíe entre paneles"free_y"
: permite que el eje y varíe entre paneles"free"
: permite que ambos ejes varíen entre paneles
Dirección del facetado
Podemos controlar el orden en que se disponen los paneles con el parámetro dir
:
# Ordenar los paneles de izquierda a derecha, luego de arriba a abajo
ggplot(mpg, aes(x = displ, y = hwy)) +
geom_point() +
facet_wrap(~ class, dir = "h")
# Ordenar los paneles de arriba a abajo, luego de izquierda a derecha
ggplot(mpg, aes(x = displ, y = hwy)) +
geom_point() +
facet_wrap(~ class, dir = "v")
Caso de uso: análisis de tendencias temporales
Un uso común de facet_wrap()
es analizar tendencias temporales por grupos. Veamos un ejemplo con el conjunto de datos economics_long
:
# Cargar datos
data(economics_long, package = "ggplot2")
# Filtrar solo algunas variables económicas
econ_subset <- subset(economics_long, variable %in% c("pce", "pop", "uempmed"))
# Crear gráfico de series temporales con facetas
ggplot(econ_subset, aes(x = date, y = value)) +
geom_line() +
facet_wrap(~ variable, scales = "free_y") +
labs(title = "Indicadores económicos de EE.UU. a lo largo del tiempo",
x = "Año",
y = "Valor")
En este ejemplo, cada panel muestra la evolución temporal de un indicador económico diferente. Al usar scales = "free_y"
, permitimos que cada variable tenga su propia escala vertical, lo que es necesario ya que las variables tienen magnitudes muy diferentes.
Combinando facet_wrap() con otras capas
facet_wrap()
se integra perfectamente con otras capas de ggplot2, lo que nos permite crear visualizaciones más informativas:
ggplot(mpg, aes(x = displ, y = hwy, color = drv)) +
geom_point() +
geom_smooth(method = "lm", se = FALSE) +
facet_wrap(~ year) +
labs(title = "Relación entre tamaño del motor y consumo por año",
color = "Tipo de tracción")
En este ejemplo, no solo dividimos los datos por año, sino que también añadimos líneas de tendencia y codificamos el tipo de tracción con colores, creando una visualización rica en información pero fácil de interpretar.
Consideraciones prácticas
Al usar facet_wrap()
, ten en cuenta estas recomendaciones:
- Limita el número de paneles a un máximo de 12-16 para mantener la legibilidad
- Usa títulos concisos para los paneles con el parámetro
labeller
- Considera usar
theme(strip.background = ...)
para personalizar la apariencia de las etiquetas de los paneles - Si tienes muchos niveles en tu variable de facetado, considera agruparlos o filtrar solo los más relevantes
# Personalizar las etiquetas de los paneles
ggplot(mpg, aes(x = displ, y = hwy)) +
geom_point() +
facet_wrap(~ class) +
theme(strip.background = element_rect(fill = "lightblue"),
strip.text = element_text(face = "bold"))
facet_wrap()
es una herramienta fundamental para explorar patrones en subgrupos de datos, permitiéndonos crear visualizaciones efectivas que revelan tanto tendencias generales como variaciones específicas entre categorías.
facet_grid() para matrices de visualización
Mientras que facet_wrap()
es ideal para trabajar con una sola variable categórica, facet_grid()
nos permite crear matrices de visualización basadas en dos variables categóricas simultáneamente. Esta función organiza los paneles en una estructura de rejilla donde una variable define las filas y otra las columnas, creando así una matriz completa de visualizaciones.
La estructura de rejilla de facet_grid()
es particularmente útil cuando queremos examinar la interacción entre dos variables categóricas y cómo afectan a nuestras variables de interés.
Sintaxis básica
La sintaxis de facet_grid()
utiliza una fórmula que especifica qué variable define las filas (a la izquierda del símbolo ~) y cuál define las columnas (a la derecha):
ggplot(datos, aes(x = variable_x, y = variable_y)) +
geom_punto() +
facet_grid(filas ~ columnas)
Si solo queremos facetas en filas o columnas, podemos usar un punto (.
) como marcador de posición:
# Solo filas
facet_grid(variable_filas ~ .)
# Solo columnas
facet_grid(. ~ variable_columnas)
Ejemplo básico con dos variables
Veamos un ejemplo utilizando el conjunto de datos mpg
:
library(ggplot2)
# Crear una matriz de visualización por tipo de tracción y número de cilindros
ggplot(mpg, aes(x = displ, y = hwy)) +
geom_point() +
facet_grid(drv ~ cyl) +
labs(title = "Consumo vs. tamaño del motor por tracción y cilindros",
x = "Cilindrada (litros)",
y = "Millas por galón en carretera")
En este ejemplo, cada fila representa un tipo de tracción (drv
: tracción delantera, trasera o en las cuatro ruedas) y cada columna representa un número de cilindros (cyl
). Esto nos permite ver rápidamente cómo la relación entre el tamaño del motor y el consumo de combustible varía según estas dos características del vehículo.
Manejo de escalas
Al igual que con facet_wrap()
, podemos controlar si las escalas son compartidas o independientes:
# Permitir escalas independientes en el eje y (por filas)
ggplot(mpg, aes(x = displ, y = hwy)) +
geom_point() +
facet_grid(drv ~ cyl, scales = "free_y")
# Permitir escalas independientes en el eje x (por columnas)
ggplot(mpg, aes(x = displ, y = hwy)) +
geom_point() +
facet_grid(drv ~ cyl, scales = "free_x")
La diferencia clave con facet_wrap()
es que facet_grid()
puede aplicar escalas libres de manera más estructurada:
- Con
scales = "free_y"
, cada fila puede tener su propia escala en el eje y - Con
scales = "free_x"
, cada columna puede tener su propia escala en el eje x
Espaciado entre paneles
Podemos controlar el espacio entre paneles con los parámetros space
y margins
:
# Espacio proporcional al rango de datos
ggplot(mpg, aes(x = displ, y = hwy)) +
geom_point() +
facet_grid(drv ~ cyl, space = "free")
El parámetro space = "free"
ajusta el tamaño de los paneles proporcionalmente al rango de datos que contienen, lo que puede ser útil para destacar visualmente grupos con mayor variabilidad.
Añadiendo márgenes para totales
Una característica útil de facet_grid()
es la posibilidad de añadir paneles marginales que muestran los datos agregados:
# Añadir paneles marginales para la variable de columnas
ggplot(mpg, aes(x = displ, y = hwy)) +
geom_point() +
facet_grid(drv ~ cyl, margins = "cyl") +
labs(title = "Consumo vs. tamaño del motor con márgenes para cilindros")
En este ejemplo, se añade una columna adicional etiquetada como "(all)" que muestra todos los datos combinados para cada tipo de tracción, independientemente del número de cilindros.
También podemos añadir márgenes para ambas variables:
ggplot(mpg, aes(x = displ, y = hwy)) +
geom_point() +
facet_grid(drv ~ cyl, margins = TRUE)
Esto añade tanto una fila como una columna adicional con los datos agregados, incluyendo un panel en la esquina que muestra todos los datos combinados.
Caso práctico: análisis de distribuciones
facet_grid()
es especialmente útil para comparar distribuciones entre grupos:
# Comparar distribuciones de consumo por tipo de tracción y transmisión
ggplot(mpg, aes(x = hwy)) +
geom_histogram(binwidth = 2, fill = "steelblue", color = "white") +
facet_grid(drv ~ trans) +
labs(title = "Distribución del consumo por tipo de tracción y transmisión",
x = "Millas por galón en carretera",
y = "Frecuencia")
Este gráfico nos permite ver cómo se distribuye el consumo de combustible para cada combinación de tipo de tracción y transmisión, revelando patrones que podrían no ser evidentes en un único histograma.
Combinando con otras variables visuales
Podemos enriquecer nuestras visualizaciones combinando facetas con otras variables estéticas:
ggplot(mpg, aes(x = displ, y = hwy, color = class)) +
geom_point() +
facet_grid(year ~ drv) +
labs(title = "Consumo vs. tamaño del motor por año y tracción",
color = "Tipo de vehículo")
En este ejemplo, usamos el color para codificar el tipo de vehículo, mientras que las facetas dividen los datos por año y tipo de tracción, creando una visualización multidimensional.
Cuándo usar facet_grid() en lugar de facet_wrap()
facet_grid()
es más adecuado cuando:
- Queremos examinar la interacción entre dos variables categóricas
- Necesitamos una estructura de matriz completa donde cada combinación de categorías tenga su propio panel
- Deseamos comparar sistemáticamente filas o columnas entre sí
# Comparación de patrones de emisiones por tipo de motor y transmisión
ggplot(mpg, aes(x = displ, y = cty)) +
geom_point() +
geom_smooth(method = "lm", se = FALSE) +
facet_grid(fl ~ trans) +
labs(title = "Relación entre tamaño del motor y consumo urbano",
subtitle = "Por tipo de combustible (filas) y transmisión (columnas)",
x = "Cilindrada (litros)",
y = "Millas por galón en ciudad")
Limitaciones a considerar
Al usar facet_grid()
, ten en cuenta estas limitaciones:
- El número de paneles crece rápidamente (filas × columnas), lo que puede hacer que el gráfico sea difícil de interpretar si hay muchas categorías
- Todas las combinaciones de categorías se muestran, incluso si no hay datos para algunas de ellas
- Los paneles siempre se organizan en una rejilla rectangular, lo que puede desperdiciar espacio si muchas combinaciones están vacías
# Ejemplo con datos faltantes en algunas combinaciones
ggplot(subset(mpg, class %in% c("2seater", "compact", "midsize", "minivan")),
aes(x = displ, y = hwy)) +
geom_point() +
facet_grid(class ~ cyl)
En este ejemplo, algunas combinaciones de clase de vehículo y número de cilindros no existen en los datos (por ejemplo, no hay minivans de 4 cilindros en el conjunto de datos), por lo que esos paneles aparecerán vacíos.
Personalización de etiquetas
Podemos personalizar las etiquetas de los paneles utilizando la función labeller
:
# Personalizar etiquetas
etiquetas_drv <- c(
"f" = "Tracción delantera",
"r" = "Tracción trasera",
"4" = "Tracción 4x4"
)
ggplot(mpg, aes(x = displ, y = hwy)) +
geom_point() +
facet_grid(drv ~ cyl, labeller = labeller(drv = etiquetas_drv))
Esta personalización mejora significativamente la interpretabilidad del gráfico, especialmente cuando las etiquetas originales son códigos o abreviaturas.
facet_grid()
es una herramienta poderosa para explorar relaciones complejas en nuestros datos, permitiéndonos crear matrices de visualización que revelan patrones y tendencias a través de múltiples dimensiones categóricas.
Otros ejercicios de programación de R
Evalúa tus conocimientos de esta lección Facetas en ggplot2 con nuestros retos de programación de tipo Test, Puzzle, Código y Proyecto con VSCode, guiados por IA.
Todas las lecciones de R
Accede a todas las lecciones de R y aprende con ejemplos prácticos de código y ejercicios de programación con IDE web sin instalar nada.
Instalación De R Y Rstudio
Introducción Y Entorno
Introducción A R
Introducción Y Entorno
Operadores
Sintaxis
Estructuras De Datos
Sintaxis
Funciones
Sintaxis
Estructuras De Control Iterativo
Sintaxis
Scopes Y Closures
Sintaxis
Estructuras De Control Condicional
Sintaxis
Funciones Anónimas
Sintaxis
Tipos De Datos Y Variables
Sintaxis
Sistema R6: Clases Referenciales Y Encapsulamiento
Programación Orientada A Objetos
Sistema S4: Clases Formales Y Validación
Programación Orientada A Objetos
Herencia Y Polimorfismo En R
Programación Orientada A Objetos
Sistemas De Oop En R
Programación Orientada A Objetos
Sistema S3: Clases Implícitas Y Métodos Genéricos
Programación Orientada A Objetos
Tidyverse Para Transformación De Datos
Manipulación De Datos
Lubridate Para Fechas Y Tiempo
Manipulación De Datos
Group_by Y Summarize Para Agrupación Y Resumen
Manipulación De Datos
Stringr Para Expresiones Regulares
Manipulación De Datos
Tidyr Para Limpieza De Valores Faltantes
Manipulación De Datos
Joins En R Para Combinación Y Relaciones De Tablas
Manipulación De Datos
Pivot_longer Y Pivot_wider Para Reestructuración
Manipulación De Datos
Mutate Y Transmute Para Transformación
Manipulación De Datos
Dplyr Para Filtrado Y Selección
Manipulación De Datos
Readr Y Read.csv Para Importar Datos
Manipulación De Datos
Gráficos Bivariantes En R
Visualización De Datos
Gráficos Univariantes En R
Visualización De Datos
Facetas En Ggplot2
Visualización De Datos
Personalización Y Temas
Visualización De Datos
Ggplot2 Para Visualización De Datos
Visualización De Datos
Gráficos Multivariantes En R
Visualización De Datos
Correlación En R
Estadística
Regresión Lineal En R
Estadística
Pruebas De Hipótesis En R
Estadística
Anova En R
Estadística
Estadística Descriptiva En R
Estadística
En esta lección
Objetivos de aprendizaje de esta lección
- Comprender el concepto de facetas en ggplot2 y su utilidad para comparar subgrupos de datos.
- Aprender a utilizar facet_wrap() para crear paneles basados en una variable categórica, controlando disposición, escalas y dirección.
- Conocer la función facet_grid() para generar matrices de visualización con dos variables categóricas y gestionar escalas, márgenes y espaciado.
- Aplicar personalizaciones en etiquetas y estilos para mejorar la legibilidad y presentación de los gráficos facetados.
- Identificar cuándo es más adecuado usar facet_wrap() o facet_grid() según el análisis que se desea realizar.