R

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ícate

facet_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.

Aprende R online

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

R

Introducción Y Entorno

Introducción A R

R

Introducción Y Entorno

Operadores

R

Sintaxis

Estructuras De Datos

R

Sintaxis

Funciones

R

Sintaxis

Estructuras De Control Iterativo

R

Sintaxis

Scopes Y Closures

R

Sintaxis

Estructuras De Control Condicional

R

Sintaxis

Funciones Anónimas

R

Sintaxis

Tipos De Datos Y Variables

R

Sintaxis

Sistema R6: Clases Referenciales Y Encapsulamiento

R

Programación Orientada A Objetos

Sistema S4: Clases Formales Y Validación

R

Programación Orientada A Objetos

Herencia Y Polimorfismo En R

R

Programación Orientada A Objetos

Sistemas De Oop En R

R

Programación Orientada A Objetos

Sistema S3: Clases Implícitas Y Métodos Genéricos

R

Programación Orientada A Objetos

Tidyverse Para Transformación De Datos

R

Manipulación De Datos

Lubridate Para Fechas Y Tiempo

R

Manipulación De Datos

Group_by Y Summarize Para Agrupación Y Resumen

R

Manipulación De Datos

Stringr Para Expresiones Regulares

R

Manipulación De Datos

Tidyr Para Limpieza De Valores Faltantes

R

Manipulación De Datos

Joins En R Para Combinación Y Relaciones De Tablas

R

Manipulación De Datos

Pivot_longer Y Pivot_wider Para Reestructuración

R

Manipulación De Datos

Mutate Y Transmute Para Transformación

R

Manipulación De Datos

Dplyr Para Filtrado Y Selección

R

Manipulación De Datos

Readr Y Read.csv Para Importar Datos

R

Manipulación De Datos

Gráficos Bivariantes En R

R

Visualización De Datos

Gráficos Univariantes En R

R

Visualización De Datos

Facetas En Ggplot2

R

Visualización De Datos

Personalización Y Temas

R

Visualización De Datos

Ggplot2 Para Visualización De Datos

R

Visualización De Datos

Gráficos Multivariantes En R

R

Visualización De Datos

Correlación En R

R

Estadística

Regresión Lineal En R

R

Estadística

Pruebas De Hipótesis En R

R

Estadística

Anova En R

R

Estadística

Estadística Descriptiva En R

R

Estadística

Accede GRATIS a R y certifícate

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.