Diagrama de sectores en ggplot2 con etiquetas fuera del gráfico

Conjunto de datos de muestra

El siguiente data frame contiene una variable numérica representando un porcentaje y una variable categórica representando grupos. Este data frame será utilizado en los ejemplos siguientes.

df <- data.frame(valor = c(15, 25, 32, 28),
                 grupo = paste0("G", 1:4))

Gráfico de sectores con valores fuera utilizando ggrepel

Si necesias mostrar los valores de tu diagrama de sectores fuera del gráfico por motivos estéticos o porque las etiquetas no caben dentro de las porciones puedes utilizar la función geom_label_repel del paquete ggrepel después de transformar el data frame original tal y como se muestra en el siguiente ejemplo.

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

# Obtener las posiciones
df2 <- df %>% 
  mutate(csum = rev(cumsum(rev(valor))), 
         pos = valor/2 + lead(csum, 1),
         pos = if_else(is.na(pos), valor/2, pos))

ggplot(df, aes(x = "" , y = valor, fill = fct_inorder(grupo))) +
  geom_col(width = 1, color = 1) +
  coord_polar(theta = "y") +
  scale_fill_brewer(palette = "Pastel1") +
  geom_label_repel(data = df2,
                   aes(y = pos, label = paste0(valor, "%")),
                   size = 4.5, nudge_x = 1, show.legend = FALSE) +
  guides(fill = guide_legend(title = "Grupo")) +
  theme_void()

Diagrama de sectores con valores fuera del gráfico en ggplot2

Ten en cuenta que puedes mostrar el porcentaje, los valores, los grupos o cualquier otra etiqueta o texto usando este método.

Gráfico de sectores con valores dentro y etiquetas fuera

Una alternativa al ejemplo anterior es agregar los valores dentro de los sectores pero etiquetar cada uno con un texto fuera. Puedes lograr esto pasando las posiciones calculadas al argumento breaks de scale_y_continuous y añadiendo las etiquetas.

Gráfico de sectores en ggplot2 con etiquetas fuera y valores dentro

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

# Obtener las posiciones
df2 <- df %>% 
  mutate(csum = rev(cumsum(rev(valor))), 
         pos = valor/2 + lead(csum, 1),
         pos = if_else(is.na(pos), valor/2, pos))

ggplot(df, aes(x = "", y = valor, fill = fct_inorder(grupo))) +
  geom_col(width = 1, color = 1) +
  geom_text(aes(label = valor),
            position = position_stack(vjust = 0.5)) +
  coord_polar(theta = "y") +
  scale_y_continuous(breaks = df2$pos, labels = df$grupo) +
  theme(axis.ticks = element_blank(),
        axis.title = element_blank(),
        axis.text = element_text(size = 15), 
        legend.position = "none", # Elimina la leyenda
        panel.background = element_rect(fill = "white"))

También te puede interesar