Aus einem Datenrahmen möchte ich ein Kreisdiagramm für fünf Kategorien mit ihren Prozentsätzen als Beschriftungen im selben Diagramm in der Reihenfolge von der höchsten zur niedrigsten im Uhrzeigersinn zeichnen.
Mein Code ist:
%Vor%Ich benutze
%Vor%, um das Label in den entsprechenden Abschnitt zu platzieren und
%Vor%für die Bezeichnungen, die die Prozentsätze sind.
Ich bekomme folgende Ausgabe:
%Vor% Ich habe den Großteil Ihres Codes erhalten. Ich fand das ziemlich einfach zu debuggen, indem ich das coord_polar
weglasse ... einfacher zu sehen, was als Balkendiagramm vor sich geht.
Die Hauptsache war, den Faktor von oben nach unten neu zu ordnen, um die richtige Reihenfolge zu erhalten, und dann einfach mit den Etikettenpositionen zu spielen, um sie richtig zu machen. Ich habe auch Ihren Code für die Labels vereinfacht (Sie benötigen nicht as.character
oder rep
und paste0
ist eine Verknüpfung für sep = ""
.)
Die Berechnung at
findet die Zentren der Keile. (Es ist einfacher, sie als Mittelpunkt von Balken in einem gestapelten Balkendiagramm zu betrachten, führen Sie einfach das obige Diagramm aus, ohne die coord_polar
-Zeile zu sehen.) Die at
-Berechnung kann wie folgt aufgeteilt werden:
table(data)
ist die Anzahl der Zeilen in jeder Gruppe und sort(table(data))
setzt sie in die Reihenfolge, in der sie geplottet werden. Das cumsum()
davon ergibt die Kanten jedes Balkens, wenn sie übereinander gestapelt werden, und das Multiplizieren mit 0.5 gibt uns die halbe Höhe eines jeden Balkens im Stapel (oder die Hälfte der Breite der Keile des Kuchens). .
as.numeric()
stellt einfach sicher, dass wir einen numerischen Vektor und nicht ein Objekt der Klasse table
haben.
Wenn Sie die Halbwertsbreiten von den kumulativen Höhen subtrahieren, werden die Zentren beim Stapeln jeweils als Balken angezeigt. Aber ggplot stapelt die Balken mit den größten auf der Unterseite, während all unsere sort()
ing die kleinsten zuerst setzen, also müssen wir nrow -
alles machen, denn was wir tatsächlich berechnet haben, sind die Label-Positionen relativ zu oben der Leiste, nicht die Unterseite. (Und bei den ursprünglichen disaggregierten Daten ist nrow()
die Gesamtanzahl der Zeilen, also die Gesamthöhe des Balkens.)