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))
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()
Ten en cuenta que puedes mostrar el porcentaje, los valores, los grupos o cualquier otra etiqueta o texto usando este método.
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.
# 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