R: graphique en secteurs avec pourcentage d'étiquettes à l'aide de ggplot2
À partir d'un bloc de données je veux tracer un graphique à secteurs pour cinq catégories avec leurs pourcentages des étiquettes sur le même graphe dans l'ordre du plus élevé au plus bas, dans le sens horaire.
Mon code est:
League<-c("A","B","A","C","D","E","A","E","D","A","D")
data<-data.frame(League) # I have more variables
p<-ggplot(data,aes(x="",fill=League))
p<-p+geom_bar(width=1)
p<-p+coord_polar(theta="y")
p<-p+geom_text(data,aes(y=cumsum(sort(table(data)))-0.5*sort(table(data)),label=paste(as.character(round(sort(table(data))/sum(table(data)),2)),rep("%",5),sep="")))
p
- Je utiliser
cumsum(sort(table(data)))-0.5*sort(table(data))
de placer l'étiquette dans la partie correspondante et
label=paste(as.character(round(sort(table(data))/sum(table(data)),2)),rep("%",5),sep="")
pour les étiquettes qui les pourcentages.
J'obtiens le résultat suivant:
Error: ggplot2 doesn't know how to deal with data of class uneval
OriginalL'auteur pescobar | 2014-10-15
Vous devez vous connecter pour publier un commentaire.
J'ai conservé la plupart de votre code. J'ai trouvé cela assez facile à déboguer en laissant de côté les
coord_polar
... plus facile de voir ce qu'il se passe comme un graphique à barres.La chose principale était de réorganiser le facteur de la plus haute à la plus basse pour obtenir le tracé de commande correct, puis il suffit de jouer avec l'étiquette de positions pour obtenir leur droit. J'ai également simplifié le code pour les étiquettes (vous n'avez pas besoin de la
as.character
ou larep
, etpaste0
est un raccourci poursep = ""
.)La
at
de calcul est de trouver le centre de les quartiers. (Il est plus facile de penser à eux comme des centres de barres en barres empilées intrigue, il suffit d'exécuter le au-dessus de l'intrigue sans lacoord_polar
ligne pour voir.) Leat
calcul peut être décomposée comme suit:table(data)
est le nombre de lignes dans chaque groupe, etsort(table(data))
les met dans l'ordre qu'ils vont être tracée. En prenant lecumsum()
de qui nous donne les bords de chaque barre lorsque empilés les uns sur les autres, et en multipliant par 0,5 nous donne la moitié les hauteurs de chaque barre dans la pile (ou la moitié de la largeur des cales de la tarte).as.numeric()
simplement nous permet de disposer d'un vecteur numérique plutôt qu'un objet de la classetable
.Soustrayant les demi-largeurs de la somme des hauteurs donne les centres de chaque barre lorsqu'ils sont empilés. Mais ggplot va empiler les bars avec le plus grand sur le fond, alors que tous nos
sort()
ing met le plus petit d'abord, nous avons donc besoin de fairenrow -
tout parce que ce que nous avons fait calculer sont l'étiquette de positions par rapport à la haut de la barre, pas le fond. (Et, avec l'origine des données ventilées,nrow()
est le nombre total de lignes d'où la hauteur totale de la barre.)pourriez-vous expliquer ce que votre code est fait lors du calcul de
at
? Merci beaucoup.ajouté quelques paragraphes en bas, voir si cela aide.
très claire et compréhensible, je vous remercie! 🙂
OriginalL'auteur Gregor
Préface: je n'ai pas fait les camemberts de ma propre volonté.
Voici une modification de la
ggpie
fonction qui comprend des pourcentages:Exemple:
Comme un typique ggplot appel:
J'ai essayé de changer la direction de la polaire avec
direction=-1
mais il semble flip à la fois le pourcentage et la direction si je reçois le même problèmeRésolu @Reno. J'ai changé la ligne suivante
label_pos = sum(perc) - cumsum(perc) + perc / 2
a fonctionné pour moi avec un
1-(cumsum(perc)-perc/2).
il est Également utile d'theme_void()
OriginalL'auteur alexpghayes
Il a travaillé sur l'ensemble inclus la fonction grandement inspiré de ici
Un exemple :
Sortie
OriginalL'auteur François Jean