Diagrama de sectores con porcentajes en ggplot2

Transformación de los datos

El siguiente conjunto de datos contiene las respuestas (Si, No o N/A) de una encuesta. Estos datos serán transformados y usados en los ejemplos de este tutorial.

set.seed(11022021)

# Variables
res <- sample(c("Si", "No", "N/A"),
              size = 100, replace = TRUE,
              prob = c(0.4, 0.35, 0.25))
gen <- sample(c("Hombre", "Mujer"),
              size = 100, replace = TRUE)

# Cambiamos los niveles de la variable para
# que "Si" aparezca primero en la leyenda
res <- factor(res, levels = c("Si", "No", "N/A"))

# Data frame
datos <- data.frame(respuesta = res,
                    genero = gen)

Haciendo uso de dplyr puedes obtener el porcentaje de cada tipo de respuesta para cada género. En el siguiente ejemplo estamos calculando el porcentaje por tipo de respuesta y agregando una nueva columna con porcentajes, haciendo uso de la función pcntent de la librería scales.

# install.packages("dplyr")
# install.packages("scales")
library(dplyr)

# Transformación de los datos
df <- datos %>% 
  group_by(respuesta) %>% # Variable a ser transformada
  count() %>% 
  ungroup() %>% 
  mutate(pcnt = `n` / sum(`n`)) %>% 
  arrange(pcnt) %>%
  mutate(etiquetas = scales::percent(pcnt))

En la tabla anterior la primera columna representa las posibles respuestas, la segunda la frecuencia absoluta, la tercera la frecuencia relativa y la cuarta el porcentaje con el símbolo.

Sectores con porcentajes

Una vez transformes tus datos, puedes pasar la columna que contiene las frecuencias relativas a y y colorear los sectores (fill) en base a la variable categórica que representa los grupos.

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

ggplot(df, aes(x = "", y = pcnt, fill = respuesta)) +
  geom_col() +
  coord_polar(theta = "y")

Agregando porcentajes a un gráfico de sectores en ggplot2

Agregando los porcentajes como etiquetas

Diagrama de sectores de porcentajes en ggplot2

La columna labels permite añadir las etiquetas con porcentajes. En este ejemplo las estamos agregando con geom_text.

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

ggplot(df, aes(x = "", y = pcnt, fill = respuesta)) +
  geom_col() +
  geom_text(aes(label = etiquetas),
            position = position_stack(vjust = 0.5)) +
  coord_polar(theta = "y")

Gráfico sectores geom_label

Una alternativa a geom_text es geom_label. Ten en cuenta que se ha tenido que añadir show.legend = FALSE para evitar que se muestre una letra sobre los recuadros de la leyenda.

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

ggplot(df, aes(x = "", y = pcnt, fill = respuesta)) +
  geom_col() +
  geom_label(aes(label = etiquetas),
             position = position_stack(vjust = 0.5),
             show.legend = FALSE) +
  coord_polar(theta = "y")

Personalización avanzada

Los gráficos de sectores se pueden personalizar de distintas maneras. Puedes personalizar la leyenda, los colores o los temas. En el siguiente ejemplo hemos eliminado el tema por defecto con theme_void. Consulta el artículo sobre diagramas de sectores en ggplot2 para obtener detalles adicionales sobre personalizar gráficos de sectores en ggplot2 y su leyenda.

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

ggplot(df, aes(x = "", y = pcnt, fill = respuesta)) +
  geom_col(color = "black") +
  geom_label(aes(label = etiquetas), color = c(1, "white", "white"),
            position = position_stack(vjust = 0.5),
            show.legend = FALSE) +
  guides(fill = guide_legend(title = "respuesta")) +
  scale_fill_viridis_d() +
  coord_polar(theta = "y") + 
  theme_void()

Diagrama de sectores en ggplot2 con porcentajes

ggplot2

Elegant Graphics for Data Analysis

Comprar en Amazon
Better Data Visualizations

A Guide for Scholars, Researchers, and Wonks

Comprar en Amazon
Storytelling con Datos

Visualización de datos para profesionales

Comprar en Amazon
Fundamentals of Data Visualization

A Primer on Making Informative and Compelling Figures

Comprar en Amazon

También te puede interesar