Lollipop chart (gráfico de piruleta) en ggplot2

Datos de muestra

En este tutorial vamos a usar el siguiente data frame, que contiene una variable numérica y otra categórica representando grupos.

# Conjunto de datos de muestra
set.seed(1)
df <- data.frame(x = LETTERS[1:10],
                 y = sample(20:35, 10, replace = TRUE))

Gráfico lollipop básico

Gráfico lollipop básico

Dadao un data frame con una variable numérica y otra categórica es posible crear un gráfico de piruleta (lollipop chart) en ggplot2 combinando geom_segment y geom_point.

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

ggplot(df, aes(x = x, y = y)) +
  geom_segment(aes(x = x, xend = x, y = 0, yend = y)) +
  geom_point() 

Lollipop chart en ggplot2

Lollipop chart horizontal

Ten en cuenta que en varios escenarios, especialmente si las etiquetas de las categorías son largas es recomendable crear un gráfico horizontal. Para ello piedes usar coord_flip o invertir el orden de las variables dentro de aes.

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

ggplot(df, aes(x = x, y = y)) +
  geom_segment(aes(x = x, xend = x, y = 0, yend = y)) +
  geom_point() +
  coord_flip()

Lollipop chart horizontal en ggplot2

Personalización

Personalizar el gráfico de piruleta en R

Puntos

Los puntos se pueden personalizar pasando argumentos a la función geom_point. En el siguiente ejemplo vamos a cambiar el tamaño, el símbolo, el color de fondo y el borde del símbolo.

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

ggplot(df, aes(x = x, y = y)) +
  geom_segment(aes(x = x, xend = x, y = 0, yend = y)) +
  geom_point(size = 4, pch = 21, bg = 4, col = 1) +
  coord_flip()

Lollipop plot personalizar los segmentos

Segmentos

De manera similar a personalizar los puntos también puedes personalizar los segmentos. En el siguiente ejemplo estamos cambiando su color a gris e incrementando el ancho.

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

ggplot(df, aes(x = x, y = y)) +
  geom_segment(aes(x = x, xend = x, y = 0, yend = y),
               color = "gray", lwd = 1.5) +
  geom_point(size = 4, pch = 21, bg = 4, col = 1) +
  coord_flip()

Cambiar las etiquetas del eje X en ggplot2

Etiquetas

Como el eje X es discreto es posible cambiar las etiquetas de las categorías con el argumento labels de scale_x_discrete.

# install.packages("ggplot2")

ggplot(df, aes(x = x, y = y)) +
  geom_segment(aes(x = x, xend = x, y = 0, yend = y),
               color = "gray", lwd = 1) +
  geom_point(size = 4, pch = 21, bg = 4, col = 1) +
  scale_x_discrete(labels = paste0("G_", 1:10)) +
  coord_flip()

Rotar las etiquetas de los ejes en ggplot2

Rotar las etiquetas

Si las etiquetas son demasiado largas no entrarán. Sin embargo, puedes rotar las etiquetas con el argumento angle de la función element_text en el componente axis.text.x.

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

ggplot(df, aes(x = x, y = y)) +
  geom_segment(aes(x = x, xend = x, y = 0, yend = y),
               color = "gray", lwd = 1) +
  geom_point(size = 4, pch = 21, bg = 4, col = 1) +
  scale_x_discrete(labels = paste("Grupo", 1:10)) +
  theme(axis.text.x = element_text(angle = 90,
                                   vjust = 0.5, hjust = 1))

Lollipop chart in ggplot2

Tema

Como en otros gráficos hechos con ggplot es posible cambiar el tema del gráfico.

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

ggplot(df, aes(x = x, y = y)) +
  geom_segment(aes(x = x, xend = x, y = 0, yend = y),
               color = "gray", lwd = 1) +
  geom_point(size = 4, pch = 21, bg = 4, col = 1) +
  scale_x_discrete(labels = paste0("G_", 1:10)) +
  coord_flip() +
  theme_minimal()

Lollipop chart en ggplot2 con textos dentro

Texto

Ten en cuenta que también puedes añadir los valores correspondientes u otro texto dentro de los puntos usando geom_text.

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

ggplot(df, aes(x = x, y = y)) +
  geom_segment(aes(x = x, xend = x, y = 0, yend = y),
               color = "gray", lwd = 1) +
  geom_point(size = 7.5, pch = 21, bg = 4, col = 1) +
  geom_text(aes(label = y), color = "white", size = 3) +
  scale_x_discrete(labels = paste0("G_", 1:10)) +
  coord_flip() +
  theme_minimal()

Ordenar los valores

Por último, también puedes reordenar el gráfico en base a una variable haciendo uso de la función reorder u otra equivalente.

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

ggplot(df, aes(x = reorder(x, -y), y = y)) +
  geom_segment(aes(x = reorder(x, -y),
                   xend = reorder(x, -y),
                   y = 0, yend = y),
               color = "gray", lwd = 1) +
  geom_point(size = 4, pch = 21, bg = 4, col = 1) +
  xlab("Grupo") +
  ylab("") +
  coord_flip() +
  theme_minimal()

Ordenar un lollipop en ggplot2

También te puede interesar