Un gráfico de dumbbell o de mancuernas es un tipo de gráfico de puntos donde los dos puntos de cada grupo están conectados con líneas rectas. Este gráfico se puede utilizar para mostrar los cambios de una variable entre dos instantes de tiempo diferentes o para mostrar el rango de una variable en varios grupos, como el crecimiento de la población en dos años diferentes en varios países o la diferencia entre los clientes actuales y potenciales de diferentes empresas.
Las aplicaciones de este tipo de gráfico son variadas, ya que se pueden usar para visualizar la distribución de los grupos en base a su rango, para crear rankings o incluso para analizar correlaciones entre grupos.
Dependiendo de tus datos puedes crear un dumbbell plot de manera diferente. A veces resulta más sencillo transformar tus datos en un formato más adecuado, pero en este tutorial vamos a revisar cómo crear un un gráfico de dumbbell en ggplot2 tanto con data frames en formato largo (df
) como ancho (df2
), por lo que se proporcionan dos conjuntos de datos.
Recomendamos siempre usar formato largo cuando se trabaja con ggplot2, ya que fue diseñado para ello.
El siguiente data frame contiene los clientes actuales y potenciales de diferentes empresas. Ten en cuenta que cada fila representa una empresa diferente.
# Semilla
set.seed(1)
# Datos
clientes <- sample(50:150, 10)
clientes_potenciales <- sample(150:500, 10)
empresa <- LETTERS[1:10]
# Datos frame
df <- data.frame(empresa = empresa,
x = clientes,
y = clientes_potenciales)
La función melt
de reshape
permite convertir un data frame en formato ancho a formato largo. Este formato muestra las variables como subgrupos de los grupos principales, de modo que cada grupo tiene tantas filas como variables y los valores se muestran todos en una misma columna en lugar de divididos en varias.
library(reshape)
# Semilla
set.seed(1)
# Datos
clientes <- sample(50:150, 10)
clientes_potenciales <- sample(150:500, 10)
empresa <- LETTERS[1:10]
# Datos frame
df2 <- data.frame(empresa = empresa,
clientes = clientes,
clientes_potenciales = clientes_potenciales)
# Data frame largo ordenado
df2 <- melt(df2, id.vars = "empresa")
df2 <- df2[order(df2$empresa), ]
geom_segment
y geom_point
Dependiendo de tu data frame tendrás que utilizar un procedimiento diferente para crear un dumbbell plot en ggplot2.
Opción 1: data frame en formato ancho
Si estás trabajando con un data frame en formato ancho puedes crear un dumbbell chart agregando líneas rectas con geom_segment
, especificando los puntos de inicio y fin para ambos ejes. Luego, tendrás que utilizar la función geom_point
dos veces para agregar los puntos. Ten en cuenta que no podrás añadir una leyenda de una manera sencilla utilizando este formato.
# install.packages("ggplot2")
library(ggplot2)
ggplot(df) +
geom_segment(aes(x = clientes, xend = clientes_potenciales,
y = empresa, yend = empresa)) +
geom_point(aes(x = clientes, y = empresa), size = 3) +
geom_point(aes(x = clientes_potenciales, y = empresa), size = 3)
Opción 2: data frame en formato largo
El formato largo es el más recomendado para crear este tipo de visualización. Tan solo tienes que pasar como entrada los nombres de las columnas que representan valores y grupos a x
e y
dentro de aes
y usar las funciones geom_line
y geom_point
. Si quieres mostrar una leyenda para los puntos tan solo tienes que pasar el nombre de la columna que representa subgrupos a color
dentro de aes
. Recuerda que puedes personalizar la posición de la leyenda con legend.position
.
# install.packages("ggplot2")
library(ggplot2)
ggplot(df2, aes(x = value, y = empresa)) +
geom_line() +
geom_point(aes(color = variable), size = 3) +
theme(legend.position = "bottom")
Personalizar el color de los puntos
Al trabajar con un data frame en formato largo puedes sobrescribir los colores de los puntos con una función de escalas de color, como scale_color_manual
o scale_color_brewer
.
# install.packages("ggplot2")
library(ggplot2)
ggplot(df2, aes(x = value, y = empresa)) +
geom_line() +
geom_point(aes(color = variable), size = 3) +
scale_color_brewer(palette = "Set1", direction = -1) +
theme(legend.position = "bottom")
ggalt
y geom_dumbbell
Una alternativa a geom_segment
y geom_point
para crear un dumbbell plot es la función geom_dumbbell
del paquete ggalt
. Usar esta función es muy sencillo, pero el data frame de entrada debe estar en formato ancho.
La función toma como entrada los grupos (x
o y
), el valor de inicio (x
o y
) y las posiciones finales (xend
o yend
). Además, la función proporciona varios argumentos para personalizar el grosor y color de las líneas y los puntos.
# install.packages("ggplot2")
# install.packages("ggalt")
library(ggplot2)
library(ggalt)
ggplot(df, aes(y = empresa, x = clientes, xend = clientes_potenciales)) +
geom_dumbbell(color = "darkgray", # Color de la línea
size = 1, # Grosor de la línea
dot_guide = FALSE, # Agregar una guía del origen a X o no
size_x = 3, # Tamaño del punto X inicial
size_xend = 3, # Tamaño del punto X final
colour_x = "#F69541", # Color del punto X inicial
colour_xend = "#699DC6") # Color del punto X final
La mayor desventaja de esta función es que si quieres agregar una leyenda tendrás que transformar los datos en formato largo y agregar los puntos de nuevo tal y como se hizo en el ejemplo anterior.
Un dumbbell plot se puede ordenar de varias maneras: por el valor de inicio, por el valor final o por otra métrica, como la media de los valores para cada grupo.
Puedes usar la función reorder
para reordenar los grupos. En el siguiente ejemplo utilizamos el conjunto de muestra en formato ancho y ordenamos los valores por el número de clientes actuales de las empresas.
# install.packages("ggplot2")
library(ggplot2)
ggplot(df, aes(y = reorder(empresa, clientes))) +
geom_segment(aes(x = clientes, xend = clientes_potenciales, yend = empresa)) +
geom_point(aes(x = clientes), size = 3, color = "red") +
geom_point(aes(x = clientes_potenciales), size = 3)
Ordenar por la media
Con el data frame de muestra en formato largo si reordenas las empresas por value
los grupos se ordenarán por defecto por su media. Sin embargo, la función reorder
permite especificar otras funciones con el argumento FUN
, como min
o max
para reordenar los valores por su valor mínimo o máximo, respectivamente.
# install.packages("ggplot2")
library(ggplot2)
ggplot(df2, aes(x = value, y = reorder(empresa, value))) +
geom_line() +
geom_point(aes(color = variable), size = 3) +
scale_color_brewer(palette = "Set1", direction = -1) +
theme(legend.position = "bottom")
Usa reorder(empresa, value, FUN = min)
o reorder(empresa, value, FUN = max)
para ordenar los datos por el valor menor o mayor para cada grupo, respectivamente.
Por último, al usar geom_dumbbell
, dado que funciona con data frames en formato ancho el proceso es el mismo que el utilizado en el primer ejemplo de esta sección. Sin embargo, en el ejemplo siguiente ordenamos los grupos en base a la columna clientes_potenciales
.
# install.packages("ggplot2")
library(ggplot2)
ggplot(df, aes(y = reorder(empresa, clientes_potenciales))) +
geom_dumbbell(aes(x = clientes, xend = clientes_potenciales),
color = "darkgray",
size = 1, dot_guide = FALSE,
size_x = 3, size_xend = 3,
colour_x = "#F69541", colour_xend = "#699DC6")
También te puede interesar