Conjuntos de datos de muestra

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))

Gráfico de barras agrupadas con 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")

Gráfico de barras agrupadas en ggplot2 con geom_col y position dodge

Gráfico de barras agrupadas en ggplot2 con geom_bar contando las observaciones

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")

Espacio entre las barras

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)

Espacio entre las barras de un gráfico de barras lado a lado en ggplot2 con position_dodge

Barras con el mismo ancho

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")

Gráfico de barras agrupadas con grupos que faltan en ggplot2

Barras con el mismo ancho en un gráfico de barras agrupadas con preserve single

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"))

Barras centradas en un gráfico de barras agrupadas con position_dodge2 en ggplot2

Añadir etiquetas a las barras

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)

Añadir etiquetas sobre las barras de un gráfico de barras agrupadas en ggplot2

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

Gráfico de barras agrupadas con el recuento de cada barra en ggplot2

# 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")

Gráfico de barras agrupadas con barras de error

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)

Gráfico de barras agrupadas con barras de error en ggplot2

Gráfico de barras agrupadas horizontal

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.

Gráfico de barras agrupadas horizontal en ggplot2

# install.packages("ggplot2")
library(ggplot2)

ggplot(df, aes(x = y, y = x, fill = grupo)) +
  geom_col(position = "dodge")

Orden de las barras

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")

Reordenar los grupos y las barras de un gráfico de barras agrupadas en ggplot2

Personalización del color

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.

Cambiar los colores de un gráfico de barras agrupadas en ggplot2

# 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"))

Personalización de la leyenda

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")

Cambiar el título y la posición de la leyenda de un gráfico de barras agrupadas en ggplot2

Barras agrupadas vs barras apiladas

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")

Gráfico de barras apiladas al 100% en ggplot2 con position fill

MASTER - STATISTICS DOT COM

Master Statistics

Aprende estadística desde lo básico hasta técnicas avanzadas, explicado con claridad

Ir al sitio
R PACKAGES IO

R Packages

Explora y descubre miles de paquetes, funciones y datasets de R

Ir al sitio

También te puede interesar