Kreisdiagramm mit ggplot in R erstellen

von | Aug 18, 2021 | R, R-Diagramme | 0 Kommentare


Mit einem Kreisdiagramm (auch Kuchendiagramm oder Tortendiagramm) kann man für nominal skalierte, wahlweise auch ordinal skalierte Variablen die relativen Häufigkeiten der Ausprägungen zur Gesamtzahl darstellen. Kurz gesagt, z.B. die prozentualen Stimmanteile der jeweiligen Parteien bei einer Wahl. Hier zeige ich das Vorgehen mittels des Paketes ggplot2. Ich hatte bereits in einem anderen Beitrag gezeigt, wie dies mit den Bordmitteln von R funktioniert.

Zunächst muss man Daten eingelesen haben. Alternativ könnt ihr sie aus dem Data-frame mit dem attach-Befehl herauslösen. Ich zeige hier die Variante mit Zugriff auf den Data-frame. Ich zeige Schritt für Schritt den Aufbau und fange zunächst mit der unformatierten Ausgangslösung an.

Zum Installieren von R bzw. RStudio empfehle ich diesen Artikel. Für augenfreundliches Arbeiten empfehle ich euch diesen Artikel sehr. Schließlich wird die Frage nach dem Import von Daten in R in diesem Artikel beantwortet.

Im Beispiel stelle ich, wie schon oben angedeutet, die prozentualen Häufigkeiten der Parteien einer Wahl dar.

 

Das Kreisdiagramm erstellen

Ein 1. Entwurf

In einem ersten Schritt wird eine Häufigkeitstabelle mit dem Befehl table() erstellt. Allerdings verlangt ggplot, dass diese Häufigkeitstabelle in einem Data-frame vorliegt. Somit wird der Befehl as.data.frame() mit dem Befehl table() für meine Variable „Wahlstimme“ aus dem Data-frame „data_xls“ kombiniert. Das Ergebnis ist ein neuer Dataframe („stimme“)


stimme <- as.data.frame(table(data_xls$Wahlstimme))

Das Ergebnis führt zu einer Tabelle mit zwei Variablen, die von R standardmäßig "Var1" und "Freq" genannt werden:

  • Var1 bezeichnet das Merkmal, also die Ausprägungen der Variable - hier die Parteinamen
  • Freq bezeichnet die Häufigkeiten, also die Zählungen

Wahlstimme
  CDU   FDP Grüne Linke   SPD 
   11    11     8    13     8

Nun kann mit dem Befehl ggplot() gestartet werden. Im Unterbefehl aes() wird die x-Variable leer gelassen, also nur x="" geschrieben. Die y-Variable ist die Häufigkeit (Freq) und das Argument fill erhält die Variablenbezeichnungen (Var1).


ggplot(stimme, aes(x="", y=Freq, fill=Var1))

Nun wird wenig intuitiv der Befehl geom_bar() für ein gestapeltes Säulendiagramm eingesetzt aber gleichzeitig auch um den wichtigsten Befehl coord_polar() ergänzt. So erhält man ein ganz einfaches erstes Kreisdiagramm.

Mit color="black" führe ich schwarze Trennlinien zwischen den Kuchenstücken ein. Die Farbe kann natürlich beliebig geändert werden.


ggplot(stimme, aes(x="", y=Freq, fill=Var1))+
  geom_bar(stat="identity", color="black")+
  coord_polar("y")

Das erste Ergebnis ist erstmal ernüchternd. Es wird nachfolgend noch entsprechend angepasst.

Kreisdiagramm ggplot R

 

Diagramm vereinfachen und Kuchenstücke einfärben

Die Farben, speziell bei der Sonntagsfrage kann und sollte man anpassen. Zunächst möchte ich aber die Achsenbeschriftungen und den grauen Hintergrund entfernen. Dazu verwendet man schlicht den Befehl "theme_void()":


ggplot(stimme, aes(x="", y=Freq, fill=Var1))+
  geom_bar(stat="identity", color="black")+
  coord_polar("y")+
  theme_void()

Kreisdiagramm ggplot R
 

Nun kann ich mit scale_fill_manual() meine Farben definieren. Diese sind in der Reihenfolge der Ausprägungen der Häufigkeitstabelle zu benennen. Achtung: Die Häufigkeitstabelle wird stets alphabetisch bzw. aufsteigend sortiert (siehe oben). Daher sind die Farben in genau der Reihenfolge anzugeben, dass es zur sortierten Reihenfolge passt. In meinem Falle Schwarz, Gelb, Grün, Dunkelrot und Rot (Beitrag zu Farben in R).


ggplot(stimme, aes(x="", y=Freq, fill=Var1))+
  geom_bar(stat="identity", color="black")+
  coord_polar("y")+
  theme_void()+
  scale_fill_manual(values = c("black", "yellow", "green", "darkred", "red"))

Kreisdiagramm ggplot R
 

Relative Häufigkeiten berechnen

Relative Häufigkeiten, also Prozentwerte erhält man durch einfaches Teilen der absoluten Häufigkeiten durch die Gesamtzahl - hier Stimmabgaben. Ich könnte diese zwar manuell zählen (es sind im Beispiel 51), das ist aber wenig dynamisch. Daher summiere ich die Anzahl aller Stimmen mit dem sum()-Befehl, den ich in die Häufigkeitstabelle, also den Dataframe "stimme" einbaue.

Jeder Eintrag in der Häufigkeitstabelle wird folglich durch die Gesamtzahl geteilt. Zu guter Letzt möchte ich dies mit 100 multiplizieren und auf zwei Nachkommastellen runden, um einfach zu lesende Prozentwerte zu erhalten (round()-Funktion. Das ganze bette ich in die paste()-Funktion ein, um es mit dem Prozentzeichen ("%") zu verbinden. Man kennt es aus Excel mit der VERKETTEN()-Funktion.

Im Code sieht das dann wie folgt aus:


stimme$Prozent <- paste(round(stimme$Freq/sum(stimme$Freq)*100,2), "%")

 

Das Ergebnis ist Folgendes im Dataframe:


Wahlstimme
   Var1 Freq Prozent
1   CDU   11 21.57 %
2   FDP   11 21.57 %
3 Grüne    8 15.69 %
4 Linke   13 25.49 %
5   SPD    8 15.69 %

 

Beschriftung erstellen

Damit man beim Lesen des Kreisdiagramms weiß, welche Partei welchen Anteil hat, ist es notwendig eine Beschriftung zu erstellen. Hierzu verwende ich jetzt die eben erstellte Variable "Prozent" aus dem Dataframe "stimme". Dazu verwende ich die geom_label()-Funktion und gebe im Unterbefehl aes() lediglich label=Prozent an.

Ein paar kleine Anpassungen sind noch vorzunehmen:

  • Die Position des Labels ist die wichtigste und mit "position = position_stack(vjust = 0.5)" wird sie im jeweiligen Kuchenstück zentriert.
  • Die Schriftfarbe passe ich an, analog zu oben sind die Schriftfarben in der sortierten Reihenfolge anzugeben: color=c("white", "black", "black", "black", "black")
  • Den Rahmen entfernt man über label.size=0
  • Die Schriftgröße erhöht man mit size=6 auf z.B. 6.
  • Mit show.legend=FALSE entfernt man die Labels ("a) aus der von ggplot bereits erstellten Legende

ggplot(stimme, aes(x="", y=Freq, fill=Var1))+
  geom_bar(stat="identity", color="black")+
  coord_polar("y")+
  theme_void()+
  scale_fill_manual(values = c("black", "yellow", "green", "darkred", "red"))+
  geom_label(aes(label=Prozent),
             position = position_stack(vjust = 0.5),
             color=c("white", "black", "black", "black", "black"),
             label.size = 0,
             size=6, 
             show.legend = FALSE)

 

Kreisdiagramm ggplot R

Legende anpassen

Die Legende heißt nun noch "Var1", weil ggplot diese Bezeichnung aus dem Dataframe übernimmt. Mit labs(fill="Partei:") kann man dies leicht ändern.


ggplot(stimme, aes(x="", y=Freq, fill=Var1))+
  geom_bar(stat="identity", color="black")+
  coord_polar("y")+
  theme_void()+
  scale_fill_manual(values = c("black", "yellow", "green", "darkred", "red"))+
  geom_label(aes(label=Prozent),
             position = position_stack(vjust = 0.5),
             color=c("white", "black", "black", "black", "black"),
             label.size = 0,
             size=6, 
  show.legend = FALSE)+
          labs(fill="Partei:")

Schließlich verwende ich noch mal die theme()-Funktion und erhöhe die Schriftgröße der Legende sowie des Legendentitels auf z.B. 15.

Hinweis: Ich habe die Prozentwerde im Kreisdiagramm auf die Größe 3.5 gesetzt.


ggplot(stimme, aes(x="", y=Freq, fill=Var1))+
  geom_bar(stat="identity", color="black")+
  coord_polar("y")+
  theme_void()+
  scale_fill_manual(values = c("black", "yellow", "green", "darkred", "red"))+
  geom_label(aes(label=Prozent),
             position = position_stack(vjust = 0.5),
             color=c("white", "black", "black", "black", "black"),
             label.size = 0,
             size=3.5, 
             show.legend = FALSE)+
  labs(fill="Partei:")+
theme(legend.text = element_text(size=15),
     legend.title = element_text(size=15))

Kreisdiagramm ggplot R

 

Videotutorial zum Erstellen eines Kreisdiagramms in R

Dieses Video ansehen auf YouTube.

 

Hat dir der Beitrag geholfen?

Dann würde ich mich über eine kleine Spende freuen, die es mir erlaubt, weiterhin kostenfreie Inhalte zu veröffentlichen.

Vielen Dank und viel Erfolg!

Über mich

Björn Walther

Excel- und SPSS-Experte

YouTube-Kanal

Excel Online-Kurs

YouTube-Kanal