web-dev-qa-db-fra.com

Ajout d'étiquettes de pourcentage sur le graphique à secteurs dans R

Ma trame de données ressemble

df
   Group   value
1 Positive    52
2 Negative   239
3 Neutral     9

Je voudrais faire un graphique circulaire du bloc de données en utilisant ggplot.

pie <- ggplot(df, aes(x="", y=value, fill=Group)) +
       geom_bar(width = 1, stat = "identity") +
       coord_polar("y", start=0) 

Ceci est mon camembert.

enter image description here

Mais quand j'essaie d'ajouter des étiquettes de pourcentage sur le graphique

pie <- ggplot(df, aes(x="", y=value, fill=Group)) +
       geom_bar(width = 1, stat = "identity") +
       coord_polar("y", start=0) +
       geom_text(aes(y = value/2 + c(0, cumsum(value)[-length(value)]),
                 label = percent(value/300 )), size=5)

Voilà mon résultat.

enter image description here

J'ai déjà vu beaucoup de la même question que la mienne, c'est-à-dire R + ggplot2 => ajouter des étiquettes sur le graphique à facettes et les solutions n'aident pas.

4

Je suis d'accord avec @hrbrmstr un graphique gaufré serait mieux. Mais pour répondre à la question d'origine ... votre problème vient de l'ordre dans lequel les coins sont dessinés, qui seront par défaut alphabétiques. Lorsque vous calculez où placer les étiquettes en fonction de l'ordre dans votre bloc de données, cela ne fonctionne pas correctement.

En tant que principe général de lisibilité, effectuez tous les calculs fantaisistes des étiquettes et des positions avant le code réel dessinant le graphique.

library(dplyr)
library(ggplot2)
library(ggmap) # for theme_nothing
df <- data.frame(value = c(52, 239, 9),
                 Group = c("Positive", "Negative", "Neutral")) %>%
   # factor levels need to be the opposite order of the cumulative sum of the values
   mutate(Group = factor(Group, levels = c("Neutral", "Negative", "Positive")),
          cumulative = cumsum(value),
          midpoint = cumulative - value / 2,
          label = paste0(Group, " ", round(value / sum(value) * 100, 1), "%"))

ggplot(df, aes(x = 1, weight = value, fill = Group)) +
   geom_bar(width = 1, position = "stack") +
   coord_polar(theta = "y") +
   geom_text(aes(x = 1.3, y = midpoint, label = label)) +
   theme_nothing()               

enter image description here

2
Peter Ellis