Los gráficos de barras comparan categorías
Un gráfico de barras responde "¿cuánto de cada uno?": una barra por categoría, con la longitud de la barra mostrando el valor de la categoría. En R la función base es barplot(), y su entrada es simplemente un vector de alturas. Dale nombres al vector y los nombres se convierten en las etiquetas bajo las barras:
visits <- c(Mon = 42, Tue = 51, Wed = 47, Thu = 60, Fri = 78)
barplot(visits,
main = "Store visits by day",
ylab = "Visits")
Cinco barras grises, etiquetadas por día, que suben desde un lunes modesto hasta un pico del viernes casi el doble de alto. Nada que instalar, nada que configurar: si sabes construir un vector con nombres, sabes graficarlo.
Los editores ejecutables de esta página solo muestran salida de texto, así que las llamadas a barplot() de aquí son fragmentos estáticos para pegar en una sesión local de R; pero el paso de conteo previo sí se ejecuta bien, y ese es el paso que más importa.
El flujo de trabajo real: primero table(), después barplot()
En la práctica rara vez tienes alturas ya contadas y ordenadas. Tienes una columna bruta de etiquetas de categoría —una fila por respuesta de encuesta, por pedido, por usuario— y el conteo es el trabajo de verdad. table() lo hace en una llamada, y su salida es un vector de conteos con nombres, que es exactamente lo que barplot() quiere:
Y entonces el gráfico es una línea más:
barplot(sort(t, decreasing = TRUE),
main = "Survey responses",
ylab = "Count")
Ese proceso de dos pasos —table() y luego barplot()— es el flujo de gráfico de barras más común de todo R. Ordenar la tabla primero es una mejora barata: las barras ordenadas por altura se leen más rápido que las ordenadas alfabéticamente, salvo que las categorías tengan un orden natural (días, meses, niveles de dosis), en cuyo caso un factor con los niveles bien ordenados evita que table() las alfabetice. Para barras que requieren agregación real —sumas o medias por grupo en lugar de conteos de filas— haz primero el paso de agrupar y resumir y pásale el resultado a barplot().
Etiquetas y estilo
Las etiquetas normalmente salen de los nombres del vector, pero names.arg las sobrescribe, útil cuando los códigos de los datos no son aptos para una audiencia:
barplot(visits,
names.arg = c("Monday", "Tuesday", "Wednesday",
"Thursday", "Friday"),
col = "steelblue",
border = NA,
main = "Store visits by day",
las = 2)
colrellena las barras; pasa un vector para colorear cada barra individualmente, pero resiste el arcoíris por defecto: el color debería significar algo, como resaltar la única barra de la que estás hablando.border = NAelimina los contornos de las barras para un aspecto más limpio.las = 2rota las etiquetas del eje perpendicularmente al eje: la solución cuando los nombres largos de categorías se solapan entre sí. Combínalo con un margen inferior mayor (par(mar = c(8, 4, 4, 2))) si los nombres son realmente largos.
Barras agrupadas y apiladas desde una matriz
Para mostrar dos dimensiones categóricas a la vez —digamos, ventas por canal y por trimestre— pásale a barplot() una matriz. Cada columna se convierte en una posición del eje de categorías, y las filas se convierten en las sub-barras:
sales <- matrix(c(12, 18, 15, 22, 20, 19, 24, 27),
nrow = 2,
dimnames = list(c("Online", "Retail"),
c("Q1", "Q2", "Q3", "Q4")))
# Grouped: rows stand next to each other within each quarter
barplot(sales, beside = TRUE,
col = c("steelblue", "orange"),
legend.text = rownames(sales),
main = "Sales by channel and quarter")
# Stacked: rows pile up into one total bar per quarter (the default)
barplot(sales, beside = FALSE,
col = c("steelblue", "orange"),
legend.text = rownames(sales))
beside = TRUE pone los dos canales hombro con hombro dentro de cada trimestre: lo mejor cuando quieres comparar los canales directamente. El apilado por defecto enfatiza el total por trimestre, con el desglose mostrado dentro de cada barra; es honesto para los totales pero hace que los segmentos internos sean difíciles de comparar entre barras, ya que sus líneas base se desplazan. legend.text = rownames(sales) añade la leyenda que hace legible cualquiera de las dos versiones.
Un interruptor más: horiz = TRUE extiende las barras a lo largo del eje horizontal. Es la disposición más amable para muchas categorías con nombres largos: cada etiqueta queda en su propia línea junto a su barra, sin necesidad de rotación.
¿Gráfico de barras o histograma?
Quienes buscan esto los confunden constantemente, y la distinción vale treinta segundos: un gráfico de barras compara categorías distintas: el eje es un conjunto de etiquetas, las barras van separadas y reordenarlas es legítimo. Un histograma agrupa en intervalos una variable numérica: el eje es una escala continua, las barras se tocan porque los intervalos son consecutivos y reordenarlas sería un sinsentido. Si tu columna contiene palabras ("Yes", "Chrome", "Q3"), quieres barplot(table(x)). Si contiene mediciones (estaturas, precios, tiempos de respuesta), quieres el histograma y hist(x).
ggplot2: geom_col vs geom_bar
La versión de ggplot2 viene en dos geoms, según si el conteo ya está hecho:
library(ggplot2)
# geom_bar(): raw observations in, counting done for you
ggplot(survey, aes(x = response)) +
geom_bar(fill = "steelblue")
# geom_col(): heights already computed, one row per bar
totals <- data.frame(day = c("Mon", "Tue", "Wed", "Thu", "Fri"),
visits = c(42, 51, 47, 60, 78))
ggplot(totals, aes(x = day, y = visits)) +
geom_col(fill = "steelblue")
geom_bar() es table() integrado en el gráfico: toma una fila por observación y cuenta. geom_col() toma datos ya agregados y mapea una columna y a la altura de la barra: el equivalente del barplot() clásico. Pasar datos ya contados a geom_bar() es la trampa estándar del principiante: cuenta las filas (una cada una) y todas las barras salen de la misma altura.
Lo que te llevas
barplot(heights)grafica un vector con nombres, ytable(x)produce exactamente esa forma a partir de datos de categorías brutos, así quebarplot(table(x))es el idioma central.- Ordena la tabla (o define los niveles del factor) antes de graficar; el orden de las barras es parte del mensaje.
- Una matriz da barras agrupadas (
beside = TRUE) o apiladas (por defecto); añadelegend.text = rownames(m). names.arg,col,las = 2yhoriz = TRUEse encargan del etiquetado; las barras horizontales son lo mejor para nombres largos.- Categorías → gráfico de barras; intervalos numéricos → histograma. En ggplot2: filas brutas →
geom_bar(), alturas calculadas →geom_col().
Lo siguiente: ggplot2 en sí, la gramática que construye todos estos gráficos, y muchos más, a partir de las mismas pocas piezas componibles.
Preguntas frecuentes
¿Cómo se hace un gráfico de barras en R?
Llama a barplot() sobre un vector de alturas. Dale nombres al vector —o constrúyelo con table(), cuya salida ya viene con nombres— y cada elemento se convierte en una barra etiquetada: barplot(table(df$category)).
¿Cómo se hace un barplot agrupado o apilado en R?
Pasa una matriz. Cada columna se convierte en una posición del eje de categorías; beside = TRUE dibuja las filas como barras una junto a otra (agrupadas), mientras que el valor por defecto beside = FALSE las apila. Añade legend.text = rownames(m) para que los lectores distingan las filas.
¿Cuál es la diferencia entre barplot() y hist() en R?
barplot() compara categorías distintas: una barra por categoría, con barras separadas. hist() agrupa una variable numérica en intervalos consecutivos: las barras se tocan porque el eje es una escala continua. Si tu variable son palabras, quieres barplot(table(x)); si son números, quieres hist(x).
¿Debo usar geom_bar o geom_col en ggplot2?
geom_bar() cuenta por ti: dale observaciones brutas y suma cada categoría. geom_col() grafica valores ya calculados: dale una fila por barra más una columna de alturas. Pasar datos ya contados a geom_bar() es el error clásico; eso necesita geom_col().