HOWTO · R
Crear diagramas de caja agrupados en R
Este artículo presenta cómo crear diagramas de caja agrupados en R
En esta página
Un diagrama de caja agrupado en ggplot2 se reduce a una decisión: qué variable debe dividir los datos en los grupos que quieres comparar. Puedes asignar esa variable a la estética fill para que geom_boxplot() dibuje cajas una junto a otra dentro de cada posición del eje x, o puedes dividir los datos en paneles separados con facet_wrap(). Los ejemplos siguientes usan el conjunto de datos gapminder junto con el paquete dplyr, y cada método produce un diagrama de caja agrupado que puedes adaptar a tus propias columnas.
Crea un diagrama de caja agrupado con geom_boxplot()
La función ggplot junto con geom_boxplot se utiliza generalmente para construir objetos de diagrama de caja. El primer argumento de ggplot es el conjunto de datos, y el segundo es la lista de asignaciones estéticas creadas con aes. En las asignaciones siguientes, x e y apuntan a las columnas continent y lifeExp de gapminder, filtradas a tres años seleccionados con funciones de dplyr.
El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.
if (requireNamespace("ggplot2", quietly = TRUE) &&
requireNamespace("gapminder", quietly = TRUE) &&
requireNamespace("dplyr", quietly = TRUE)) {
library(ggplot2)
library(gapminder)
library(dplyr)
dat <- gapminder %>%
filter(year %in% c(1972, 1992, 2007))
print(ggplot(dat, aes(x = continent, y = lifeExp)) +
geom_boxplot() +
scale_y_continuous(name = "Average Life Expectancy") +
scale_x_discrete(labels = abbreviate, name = "Continent"))
}
Esta llamada dibuja una caja por continente. Ya está agrupada por la variable x, pero los años dentro de cada continente todavía se combinan en un solo grupo. El siguiente paso es añadir la segunda variable de agrupación. La guarda requireNamespace permite que el script termine sin errores donde los paquetes de gráficos no están instalados; en ese caso se omite el dibujo, así que trata el código como una ilustración de sintaxis y apóyate en las figuras renderizadas que aparecen más adelante en el artículo.
Agrupa las cajas con la estética fill
Asignar una columna a fill le indica a geom_boxplot que dibuje una caja separada para cada uno de sus grupos dentro de cada posición del eje x. Hay un detalle importante: fill solo crea grupos distintos cuando la variable asignada es discreta. La columna year de gapminder es numérica, por lo que fill = year se trata como un gradiente de color continuo y el gráfico no se divide en cajas anuales. Al envolverla en factor, los números se convierten en niveles categóricos, lo que produce las cajas agrupadas esperadas. Puedes ver la distinción en R puro:
El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.
year <- c(1972, 1992, 2007)
print(class(year))
print(class(factor(year)))
print(levels(factor(year)))
[1] "numeric"
[1] "factor"
[1] "1972" "1992" "2007"
Un year numérico sigue siendo un valor continuo, mientras que factor(year) lleva niveles con nombre — y fill solo genera cajas separadas para la segunda forma. En ggplot2 la misma distinción decide la disposición:
if (requireNamespace("ggplot2", quietly = TRUE) &&
requireNamespace("gridExtra", quietly = TRUE) &&
requireNamespace("gapminder", quietly = TRUE) &&
requireNamespace("dplyr", quietly = TRUE)) {
library(ggplot2)
library(gridExtra)
library(gapminder)
library(dplyr)
dat <- gapminder %>%
filter(year %in% c(1972, 1992, 2007))
p1 <- ggplot(dat, aes(x = continent, y = lifeExp, fill = year)) +
geom_boxplot() +
scale_y_continuous(name = "Average Life Expectancy") +
scale_x_discrete(labels = abbreviate, name = "Continent")
p2 <- ggplot(dat, aes(x = continent, y = lifeExp, fill = factor(year))) +
geom_boxplot() +
scale_y_continuous(name = "Average Life Expectancy") +
scale_x_discrete(labels = abbreviate, name = "Continent")
grid.arrange(p1, p2, nrow = 2)
}
El panel superior mantiene year numérico y permanece sin agrupar, mientras que el panel inferior usa factor(year) y muestra tres cajas por continente, una por cada año seleccionado.
Divide los grupos en paneles con facet_wrap()
La función facet_wrap es otra opción para dibujar diagramas de caja agrupados por una variable elegida. Aquí crea un panel por año. facet_wrap funciona sin una asignación de fill, pero mantener fill = factor(year) colorea las cajas para que los paneles sean más fáciles de distinguir.
El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.
if (requireNamespace("ggplot2", quietly = TRUE) &&
requireNamespace("gapminder", quietly = TRUE) &&
requireNamespace("dplyr", quietly = TRUE)) {
library(ggplot2)
library(gapminder)
library(dplyr)
dat <- gapminder %>%
filter(year %in% c(1972, 1992, 2007))
p3 <- ggplot(dat, aes(x = continent, y = lifeExp, fill = factor(year))) +
geom_boxplot() +
facet_wrap(~year) +
scale_y_continuous(name = "Average Life Expectancy") +
scale_x_discrete(labels = abbreviate, name = "Continent")
print(p3)
}
De forma predeterminada, cada panel producido por facet_wrap comparte las mismas escalas, lo que mantiene los valores directamente comparables entre paneles. Pasar scales = "free" permite que cada panel ajuste sus propios ejes a los datos que contiene; eso puede revelar detalles en un panel estrecho, pero también hace que las comparaciones entre paneles sean engañosas, porque alturas idénticas ya no significan valores idénticos.
if (requireNamespace("ggplot2", quietly = TRUE) &&
requireNamespace("gapminder", quietly = TRUE) &&
requireNamespace("dplyr", quietly = TRUE)) {
library(ggplot2)
library(gapminder)
library(dplyr)
dat <- gapminder %>%
filter(year %in% c(1972, 1992, 2007))
p4 <- ggplot(dat, aes(x = continent, y = lifeExp, fill = factor(year))) +
geom_boxplot() +
facet_wrap(~year, scales = "free") +
scale_y_continuous(name = "Average Life Expectancy") +
scale_x_discrete(labels = abbreviate, name = "Continent")
print(p4)
}
Elige una disposición y comprueba el resultado
Usa la agrupación con fill cuando tengas un número pequeño de grupos y quieras compararlos directamente dentro de cada categoría del eje x; usa facet_wrap cuando haya muchos grupos o cuando cada subconjunto merezca su propio panel. También puedes intercambiar qué variable se asigna a fill y cuál controla las facetas. El ejemplo siguiente vuelve al conjunto de datos gapminder sin filtrar, asigna continent a fill y deja que facet_wrap tome todos los años disponibles.
El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.
if (requireNamespace("ggplot2", quietly = TRUE) &&
requireNamespace("gapminder", quietly = TRUE)) {
library(ggplot2)
library(gapminder)
p5 <- ggplot(gapminder, aes(x = continent, y = lifeExp, fill = continent)) +
facet_wrap(~year) +
geom_boxplot() +
scale_y_continuous(name = "Average Life Expectancy") +
scale_x_discrete(labels = abbreviate, name = "Continent")
print(p5)
}
Elijas la disposición que elijas, comprueba que el gráfico renderizado tenga el número esperado de cajas o paneles por grupo. Si una columna numérica produce una leyenda de color suave en lugar de cajas separadas, conviértela primero con factor; si los paneles parecen idénticos en forma pero difieren en posición, confirma que las escalas sean compartidas antes de leer valores del gráfico.