Para crear un gráfico de barras agrupadas, también conocido como gráfico de barras lado a lado, gráfico de columnas agrupadas o grouped bar chart, necesitas una variable categórica para los grupos principales (el eje X) y otra variable categórica para los subgrupos, que se representarán con un color diferente. Al igual que con los gráficos de barras en ggplot2, tu conjunto de datos puede contener el valor para cada combinación de grupos o todas las ocurrencias de las variables categóricas, de modo que quieras contarlas.
Datos con un valor para cada grupo y subgrupo
df <- data.frame(x = rep(c("A", "B", "C"), each = 3),
grupo = rep(c("G1", "G2", "G3"), times = 3),
y = c(10, 6, 8, 5, 9, 12, 7, 4, 11))
Solo datos categóricos
set.seed(1)
df2 <- data.frame(cat = sample(c("A", "B", "C"), 100, replace = TRUE),
grupo = sample(c("G1", "G2"), 100, replace = TRUE))
position = "dodge"
Por defecto, si pasas una variable categórica al argumento fill de aes, ggplot2 creará un gráfico de barras apiladas. Para colocar las barras una al lado de la otra tendrás que establecer position = "dodge" dentro de geom_col o de geom_bar. Si prefieres R base consulta el gráfico de barras agrupadas en R con la función barplot.
geom_col
Si tus datos ya contienen el valor para cada grupo y subgrupo, como ocurre en el data frame de muestra llamado df, usa geom_col y pasa los subgrupos a fill.
# install.packages("ggplot2")
library(ggplot2)
ggplot(df, aes(x = x, y = y, fill = grupo)) +
geom_col(position = "dodge")


geom_bar
Si solo tienes las variables categóricas, como en df2, usa geom_bar en su lugar, de modo que la función cuente el número de ocurrencias para cada combinación de grupos.
# install.packages("ggplot2")
library(ggplot2)
ggplot(df2, aes(x = cat, fill = grupo)) +
geom_bar(position = "dodge")
La opción position = "dodge" es equivalente a position = position_dodge(), pero la función permite personalizar la distancia entre las barras de cada grupo con su argumento width. Ten en cuenta que el argumento width de geom_col controla el ancho de las barras, por lo que puedes combinar ambos para dejar un espacio entre las barras de un mismo grupo.
# install.packages("ggplot2")
library(ggplot2)
ggplot(df, aes(x = x, y = y, fill = grupo)) +
geom_col(position = position_dodge(width = 0.8),
width = 0.7)

Cuando algunas combinaciones de grupos no existen las barras tendrán anchos diferentes, ya que ggplot2 ocupa todo el espacio disponible para cada grupo. En el siguiente conjunto de datos el grupo C solo tiene un subgrupo, por lo que su barra es tan ancha como las tres barras de los otros grupos.
df3 <- df[-c(8, 9), ]
ggplot(df3, aes(x = x, y = y, fill = grupo)) +
geom_col(position = "dodge")


preserve = "single"
Para que todas las barras tengan el mismo ancho establece preserve = "single" dentro de position_dodge. La barra se colocará en la posición de su subgrupo, por lo que quedará un espacio vacío en el grupo.
ggplot(df3, aes(x = x, y = y, fill = grupo)) +
geom_col(position = position_dodge(preserve = "single"))
position_dodge2
Si prefieres centrar las barras de cada grupo puedes usar position_dodge2 con preserve = "single". Esta función también permite añadir un espacio entre las barras con el argumento padding.
ggplot(df3, aes(x = x, y = y, fill = grupo)) +
geom_col(position = position_dodge2(preserve = "single"))

Puedes añadir los valores sobre las barras con geom_text o geom_label. La clave es usar la misma posición dodge para los textos y para las barras, de modo que cada etiqueta se coloque sobre su barra. Ten en cuenta que el ancho dodge por defecto de las barras es 0.9.
# install.packages("ggplot2")
library(ggplot2)
ggplot(df, aes(x = x, y = y, fill = grupo)) +
geom_col(position = "dodge") +
geom_text(aes(label = y),
position = position_dodge(width = 0.9),
vjust = -0.5)

Si estás contando las observaciones con geom_bar puedes mostrar el recuento de cada barra con after_stat(count).

# install.packages("ggplot2")
library(ggplot2)
ggplot(df2, aes(x = cat, fill = grupo)) +
geom_bar(position = "dodge") +
geom_text(aes(label = after_stat(count)), stat = "count",
position = position_dodge(width = 0.9),
vjust = 1.5, colour = "white")
Si tus valores son medias puedes añadir barras de error a cada barra con geom_errorbar. Al igual que con las etiquetas, tendrás que establecer el mismo ancho dodge para las barras y para las barras de error. En este ejemplo añadimos una columna llamada se con el error estándar de cada valor.
df$se <- c(1.2, 0.8, 1, 0.7, 1.1, 1.5, 0.9, 0.6, 1.3)
ggplot(df, aes(x = x, y = y, fill = grupo)) +
geom_col(position = position_dodge(width = 0.9)) +
geom_errorbar(aes(ymin = y - se, ymax = y + se),
position = position_dodge(width = 0.9),
width = 0.25)

Existen dos formas de crear un gráfico de barras agrupadas horizontal: invirtiendo los ejes con coord_flip o pasando la variable categórica al argumento y de aes, como en el siguiente ejemplo.

# install.packages("ggplot2")
library(ggplot2)
ggplot(df, aes(x = y, y = x, fill = grupo)) +
geom_col(position = "dodge")
El orden de los grupos y el orden de las barras dentro de cada grupo dependen de los niveles de las variables categóricas correspondientes. Para cambiarlos puedes reordenar los niveles de los factores con la función factor.
df$x <- factor(df$x, levels = c("C", "B", "A"))
df$grupo <- factor(df$grupo, levels = c("G3", "G2", "G1"))
ggplot(df, aes(x = x, y = y, fill = grupo)) +
geom_col(position = "dodge")

Las barras se colorean con la paleta de colores por defecto de ggplot2, pero puedes elegir tus propios colores con scale_fill_manual o usar cualquier otra paleta de colores. Además, puedes añadir un borde a las barras con el argumento color de geom_col.

# install.packages("ggplot2")
library(ggplot2)
ggplot(df, aes(x = x, y = y, fill = grupo)) +
geom_col(position = "dodge", color = "white") +
scale_fill_manual(values = c("#4472C4", "#ED7D31", "#70AD47"))
La leyenda del gráfico de barras agrupadas muestra los subgrupos que pasaste a fill. Puedes cambiar su título con labs y su posición con el componente legend.position de la función theme. Consulta el tutorial sobre leyendas en ggplot2 para más opciones de personalización.
# install.packages("ggplot2")
library(ggplot2)
ggplot(df, aes(x = x, y = y, fill = grupo)) +
geom_col(position = "dodge") +
labs(fill = "Subgrupo") +
theme(legend.position = "bottom")

Un gráfico de barras agrupadas facilita comparar los valores de los subgrupos, ya que todas las barras empiezan en cero. Si te interesa más el total de cada grupo y la contribución de cada subgrupo a ese total puedes crear un gráfico de barras apiladas tan solo eliminando el argumento position, o un gráfico de barras apiladas al 100% estableciendo position = "fill".
# install.packages("ggplot2")
library(ggplot2)
ggplot(df, aes(x = x, y = y, fill = grupo)) +
geom_col(position = "fill")

Aprende estadística desde lo básico hasta técnicas avanzadas, explicado con claridad
Ir al sitio
También te puede interesar