Conjunto de datos de muestra

El siguiente data frame contiene dos variables. La primera es categórica y representa grupos únicos (etiquetas, nombres, años, …) mientras que la segunda contiene el valor correspondiente para cada etiqueta. Estos datos serán usados a lo largo de este tutorial.

# Datos
set.seed(6)
df <- data.frame(grupo = LETTERS[1:20],
                 valor = rnorm(20))

Gráfico de barras divergentes con geom_bar

Los gráficos de barras divergentes son un tipo de gráfico de barras que se pueden utilizar para visualizar cómo se distribuyen los valores, generalmente entre positivos y negativos.

Barras divergentes por defecto en ggplot2

Para crear un gráfico de barras divergentes en ggplot2 se puede utilizar la función geom_bar y pasar tus datos.

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

ggplot(df, aes(x = grupo, y = valor)) +
  geom_bar(stat = "identity",
           show.legend = FALSE) + # Eliminar la leyenda
  xlab("Grupo") +
  ylab("Valor")

Barras divergentes en ggplot2

Reordenar los valores

Ten en cuenta que para obtener una mejor visualización de los datos es recomendable reordenar las barras en base al valor que representan. Para ello puedes utilizar la función reorder tal y como se muestra a continuación.

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

ggplot(df, aes(x = reorder(grupo, valor), y = valor)) +
  geom_bar(stat = "identity",
           show.legend = FALSE) +
  xlab("Grupo") +
  ylab("Valor")

Ordenar las barras de un gráfico de barras divergentes en ggplot2

Barras divergentes verticales

Los gráficos de barras divergentes pueden ser verticales y horizontales. Si prefieres que sea vertical cambia el orden de las variables dentro de aes o usa coord_flip para rotar los ejes.

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

ggplot(df, aes(x = reorder(grupo, valor), y = valor)) +
  geom_bar(stat = "identity",
           show.legend = FALSE) +
  xlab("Grupo") +
  ylab("Valor") +
  coord_flip()

Barras divergentes verticales en R

Agregar o personalizar las etiquetas

Probablemente necesites rotar las etiquetas de tu gráfico si son demasiado largas o simplemente agregar información a cada barra. En este escenario tendrás que usar los argumentos de la función theme, modificar los límites de los ejes o usar la función geom_text para agregar textos adicionales, tal y como se muestra en los ejemplos siguientes.

Rotar los nombres de los ejes de un gráfico en R

Rotar los nombres de los grupos

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

ggplot(df, aes(x = grupo, y = valor)) +
  geom_bar(stat = "identity",
           show.legend = FALSE) +
  xlab("Grupo") +
  ylab("Valor") +
  theme(axis.text.x = element_text(angle = 90,
                                   hjust = 1,
                                   vjust = 0.5))

Texto para cada barra en un gráfico de barras divergente en R

Agregando texto a cada barra (texto vertical)

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

ggplot(df, aes(x = reorder(grupo, valor), y = valor)) +
  geom_bar(stat = "identity",
           show.legend = FALSE) +
  geom_text(aes(label = round(valor, 1),
                angle = 90,
                hjust = ifelse(valor < 0, 1.25, -0.25),
                vjust = 0.5),
            size = 3) +
  xlab("Grupo") +
  ylab("Valor") + 
  scale_y_continuous(limits = c(min(df$valor) - 0.2,
                                max(df$valor) + 0.2))

Etiquetas verticales barras divergentes en R

Agregando texto a cada barra (texto horizontal)

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

ggplot(df, aes(x = reorder(grupo, valor), y = valor)) +
  geom_bar(stat = "identity",
           show.legend = FALSE) +
  geom_text(aes(label = round(valor, 1),
                hjust = 0.5,
                vjust = ifelse(valor < 0, 1.5, -1)),
            size = 2.5) +
  xlab("Grupo") +
  ylab("Valor") +
  scale_y_continuous(limits = c(min(df$valor) - 0.2,
                                max(df$valor) + 0.2))

Etiquetar las barras de un gráfico de barras divergentes en R

Agregando texto a cada barra (gráfico vertical)

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

ggplot(df, aes(x = reorder(grupo, valor), y = valor)) +
  geom_bar(stat = "identity",
           show.legend = FALSE) +
  geom_text(aes(label = round(valor, 1),
                hjust = ifelse(valor < 0, 1.5, -1),
                vjust = 0.5),
            size = 3) +
  xlab("Grupo") +
  ylab("Valor") +
  coord_flip() + 
  scale_y_continuous(breaks= seq(-2, 2, by = 1),
                                limits = c(min(df$valor) - 0.5,
                                           max(df$valor) + 0.5))

Personalización del color

Por defecto, las barras de un gráfico de barras divergente son de color gris oscuro. Sin embargo, es muy sencillo personalizar el color de las barras y su borde de diferentes maneras.

Sobrescribir el color por defecto de las barras

Para cambiar el color de fondo y del borde para todas las barras tan solo es necesario pasar los colores elegidos a los argumentos fill y color de geom_bar, respectivamente.

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

ggplot(df, aes(x = reorder(grupo, valor), y = valor)) +
  geom_bar(stat = "identity",
           show.legend = FALSE,
           fill = 4,          # Color de fondo
           color = "white") + # Color del borde
  xlab("Grupo") +
  ylab("Valor")

Cambiar el color de las barras de un gráfico de barras divergente

Color en base al valor

Es muy habitual establecer un color diferente para los valores negativos y positivos. Para lograrlo puedes crear una nueva variable categórica basada en el valor deseado y pasarla al argumento fill.

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

# Color basado en valor
color <- ifelse(df$valor < 0, "pink", "lightblue")

ggplot(df, aes(x = reorder(grupo, valor), y = valor)) +
  geom_bar(stat = "identity",
           show.legend = FALSE,
           fill = color,      # Color de fondo
           color = "white") + # Color del borde
  xlab("Grupo") +
  ylab("Valor")

Gráfico de barras divergentes en ggplot2 con color de las barras en base al valor de una variable

Degradado

Ten en cuenta que también puedes pasar una variable numérica a fill. Los colores del degradado por defecto se pueden modificar haciendo uso de las funciones scale_fill_gradient.

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

ggplot(df, aes(x = reorder(grupo, valor), y = valor)) +
  geom_bar(stat = "identity",
           show.legend = FALSE,
           aes(fill = valor),  # Color de fondo
           color = "gray30") + # Color del borde
  xlab("Grupo") +
  ylab("Valor") +
  scale_fill_gradient2(low = "#F4A460",
                       mid = "aliceblue",
                       high = "#6495ED")

Barras divergentes en ggplot2 con color degradado para las barras

Gráfico de barras divergentes avanzado en ggplot2

Para finalizar, vamos a crear un par de ejemplos más avanzados de gráficos de barras divergentes en ggplot2, personalizando el tema, los colores, los límites de los ejes y el grid.

Gráfico de barras divergentes avanzado en R

Ejemplo 1: límites de los ejes, color y tema

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

# Color basado en valor
color <- ifelse(df$valor < 0, "pink", "lightblue")

ggplot(df, aes(x = reorder(grupo, valor), y = valor)) +
  geom_bar(stat = "identity",
           show.legend = FALSE,
           fill = color,      # Color de fondo
           color = "white") + # Color del borde
  xlab("Grupo") +
  ylab("Valor") +
  scale_y_continuous(breaks= seq(-2, 2, by = 1),
                     limits = c(min(df$valor) - 0.2,
                                max(df$valor) + 0.2)) +
  coord_flip() +
  theme_minimal() # Tema

Gráfico de barras divergentes en ggplot2

Ejemplo 2: nombres para cada barra, grid vertical y línea vertical

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

# Color basado en valor
color <- ifelse(df$valor < 0, "pink", "lightblue")

ggplot(df, aes(x = reorder(grupo, valor), y = valor)) +
  geom_bar(stat = "identity",
           show.legend = FALSE,
           fill = color,     
           color = "white") +
  geom_hline(yintercept = 0, color = 1, lwd = 0.2) +
  geom_text(aes(label = grupo, # Textos con grupos
                hjust = ifelse(valor < 0, 1.5, -1),
                vjust = 0.5), size = 2.5) +
  xlab("Grupo") +
  ylab("Valor") +
  scale_y_continuous(breaks = seq(-2, 2, by = 1),
                     limits = c(-2.5, 2.5)) +
  coord_flip() +
  theme_minimal() +
  theme(axis.text.y = element_blank(),  # Eliminar textos eje Y
        axis.ticks.y = element_blank(), # Eliminar ticks eje Y
        panel.grid.major.y = element_blank()) # Eliminar grid horizontal

También te puede interesar