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.

Conjuntos de datos de muestra

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.

Data frame ancho

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)

Data frame largo

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

Dumbbell chart con 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)

Dumbbell chart en ggplot2 con geom_segment y geom_point

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

Dumbbell plot en ggplot2 usando un data frame en formato largo

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

Color de un dumbbell chart en ggplot2

Dumbbell plot con 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.

La función geom_dubbell del paquete ggalt

# 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.

Dumbbell plot ordenado

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 un gráfico de mancuernas en ggplot2

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

Ordenar un dumbbell chart en R por su media

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

Reordenar un dumbbell plot en R

También te puede interesar