Cómo hacer un gráfico de donut en 3 pasos con R

dataviz tools
Autor/a

Paula LC

Fecha de publicación

11 de junio de 2021

En el anteriores posts hablamos sobre qué es un gráfico de donut y en qué ocasiones conviene utilizarlo. Hoy veremos cómo hacer este tipo de visualizaciones con R.

Datos

Los gráficos de donut se utilizan para representar datos de tipo categórico. Para el ejemplo utilizaremos un dataset sobre los vinos con Denominación de Origen Protegida de España que está disponible en el GitHub de este blog.

library(ggplot2)
library(dplyr)
df <- read.csv('https://raw.githubusercontent.com/elartedeldato/datasets/main/vinos.csv')

El paquete de visualización que utilizaremos será ggplot2 como de costumbre, aunque existen otras librerías que nos permitirían realizar esta clase de gráficos como [highcharter](https://jkunst.com/highcharter/).

Además, el dataset inicial contiene tres variables: una con el tipo de vinos, otra con la cantidad total de hectolitros comercializada y una tercera con el porcentaje que representa. Al ser un número de categorías alto (10) es recomendable hacer un tratamiento de los datos agrupando alguno de los tipos de vino.

El número de grupos final lo elegiremos en función del significado del dato en sí e intentando que el resultado final tenga sentido con la visualización final que vamos buscando, el gráfico de donut. Estas categorías son:

  • Tinto

  • Blanco

  • Espumoso

  • Rosado

  • Otros

Todas estas transformaciones las realizaremos con la librería dplyr de R.

df %>% 
  mutate(grupo:=c('Tinto', 'Blanco', 'Espumoso','Rosado','Otros', 'Espumoso', rep('Otros',4))) %>%
  group_by(grupo) %>% 
  summarise(hl:=sum(hl)) %>%
  mutate(pct_hl:=round(hl/sum(hl)*100,1)) %>%
  arrange(desc(pct_hl))-> df_agrupado

Elección de colores

El vector de colores, aunque se haya definido de forma manual, proviene de la paleta de colores Antique de la librería rcartocolor desarrollada por la empresa CARTO. Si quieres conocer más sobre otras opciones en R para elegir paletas de colores vuelve a leer este post. Se han elegido en función de la categoría que representan. Al tratarse de un dataset de vinos es sencillo relacionar el color con la tonalidad real de la bebida.

colors <- c("#7C7C7C", "#A06177", "#AF6458", '#D9AF6B', "#855C75")

Visualización

Paso 1. Representar los datos en un gráfico de columnas apiladas

Para la realización del gráfico de donut en R, partimos de un gráfico de columnas apiladas. Para ello utilizamos la función position_stack(). También tendremos en cuenta que necesitaremos reordenar las categorías por porcentaje de mayor a menor. Esto facilitará la comprensión de la visualización final.

ggplot(df_agrupado, aes(x=1, y=pct_hl, fill=reorder(grupo, pct_hl))) +
      geom_col(position=position_stack()) +
      geom_text(position=position_stack(vjust=0.5), 
                aes(x=2, y=pct_hl, label=paste0(grupo, '\n(', pct_hl, '%)'), 
                    color=reorder(grupo, pct_hl)), family='mono', size=4) +
      scale_fill_manual(values=colors) +
      scale_color_manual(values=colors)

Gráfico de columnas apiladas Gráfico de columnas apiladas con el porcentaje de vinos comercializado según su tipo

Paso 2. Establecer coordenadas polares sobre el eje y

Para realizar el gráfico de donut necesitaremos modificar las coordenadas a tipo polar sobre el eje y. Con esto, el resultado obtenido será un gráfico de sectores que también podría utilizarse para representar este tipo de datos. Aún así, faltarían algunos otros detalles a tener en cuenta, como la distancia de las etiquetas a los sectores a los que se refiere, o eliminar la leyenda. Tendremos en cuenta estos detalles en la siguiente sección.

    last_plot() +
      coord_polar(theta="y") 

Gráfico de sectores Gráfico de sectores con el porcentaje de vinos comercializado según su tipo

Paso 3. Establecer límites del eje x

last_plot() +
      xlim(c(-1, 2)) +
      labs(title='Comercialización de vinos de DOP 2018/19',
           caption='Fuente: DOP 2018 mapa.gob.es') +
      theme_void() +
      theme(legend.position = "none",
            text = element_text(family='mono', color='white'),
            plot.title = element_text(family='Roboto-Thin', size=20, hjust=0.5),
            plot.margin = unit(c(1,2,1,2), 'cm'),
            plot.background = element_rect(fill='#212020'))

Para definir el círculo central del donut se establecen límite mínimo negativo en el eje x a través de la función xlim(). Si se desea que el círculo central sea más amplio o menos, simplemente se debe modificar el límite inferior del intervalo.

Por otro lado, hemos añadido el título al gráfico, así como la fuente de datos.

Finalmente, se elimina el tema por defecto de ggplot y establecemos el estilo que más se adapte al entorno en que se pretenda presentar la visualización. Hemos modificado la tipografía por defecto, a la familia Robot de Google, y ampliado los márgenes iniciales.

Gráfico de donut

Contenido relacionado