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