Kreisdiagramm mit ggplot in R erstellen

von | Zuletzt bearbeitet am: Feb 19, 2025 | R, R-Diagramme

Mit einem Kreisdiagramm (auch Kuchendiagramm oder Tortendiagramm) kann man für nominal skalierte, wahlweise auch ordinal skalierte Variablen die Häufigkeiten der Ausprägungen relativ zur Gesamtzahl darstellen, z.B. einen Notenspiegel mit prozentualen Angaben. 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.

 

0 Optionale Vorarbeiten

Zunächst müssen Daten eingelesen sein. Ich zeige hier die Variante mit Zugriff auf den Dataframe. Die Daten können auch aus dem Dataframe mit der attach()-Funktion herausgelöst werden.

Sollten es kategoriale Variablen sein, sollten jene als Faktor definiert sein und jeweils eine Wertbeschriftung/Wertelabel besitzen, damit diese Informationen direkt an das Diagramm mitgegeben werden.

Für Schulnoten vergebe ich Wertelabels und sortiere sie anschließend absteigend. Würde ich die letzte Zeile nicht durchführen, würde die Sortierung später Alphabetisch vorgenommen werden, also mit „Ausreichend beginnen“.


# Definieren von Wertelabels
df$Sportnote [df$Sportnote  == "1"] <- "Sehr gut"
df$Sportnote [df$Sportnote  == "2"] <- "Gut"
df$Sportnote [df$Sportnote  == "3"] <- "Befriedigend"
df$Sportnote [df$Sportnote  == "4"] <- "Ausreichend"
df$Sportnote [df$Sportnote  == "5"] <- "Ungenügend"
df$Sportnote [df$Sportnote  == "6"] <- "Mangelhaft"

# Sortierung
df$Sportnote <- factor(df$Sportnote, 
                    levels=c("Sehr gut", "Gut", "Befriedigend", "Ausreichend",
                             "Ungenügend", "Mangelhaft"))

 

1. Das Kreisdiagramm erstellen

1.1 Ein erster Entwurf

In einem ersten Schritt wird eine Häufigkeitstabelle mit dem table()-Befehl erstellt. Allerdings verlangt ggplot, dass diese Häufigkeitstabelle in einem Dataframe vorliegt. Somit wird der Befehl as.data.frame() mit dem Befehl table() für meine Variable "Sportnote" aus dem Data-frame "df" kombiniert. Das Ergebnis ist ein neuer Dataframe, der beliebig benannt werden kann, z.B. "stimme".


noten <- as.data.frame(table(df$Sportnote))

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 Sportnoten
  • Freq bezeichnet die Häufigkeiten, also die Zählungen

 Var1 Freq
          Var1 Freq
1     Sehr gut    6
2          Gut   14
3 Befriedigend   11
4  Ausreichend   11
5   Ungenügend    7
6   Mangelhaft    2

Nun kann mit dem Befehl ggplot() des ggplot2-Pakets 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).


library(ggplot2)
ggplot(noten, 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() via + in der letzten Zeile 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(noten, 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.


 

1.2 Diagramm vereinfachen und Kuchenstücke einfärben

Zunächst möchte ich 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 den Befehl scale_fill_manual() mit + anhängen und 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 sind gute Noten in Grüntönen und schlechte Noten in Rottönen (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("palegreen4", "palegreen3", 
                               "palegreen",  "firebrick3", 
                               "firebrick", "firebrick4"))

Kreisdiagramm ggplot
 

1.3 Relative Häufigkeiten berechnen

Relative Häufigkeiten, also Prozentwerte erhält man durch einfaches Teilen der absoluten Häufigkeiten durch die Gesamtzahl aller Noten. 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:


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

 

Das Ergebnis ist Folgendes im Dataframe:


          Var1 Freq Prozent
1     Sehr gut    6 11.76 %
2          Gut   14 27.45 %
3 Befriedigend   11 21.57 %
4  Ausreichend   11 21.57 %
5   Ungenügend    7 13.73 %
6   Mangelhaft    2  3.92 %

 

1.4 Beschriftung erstellen

Damit man beim Lesen des Kreisdiagramms weiß, welche Note welchen Anteil hat, ist es notwendig eine Beschriftung zu erstellen. Hierzu verwende ich jetzt die eben erstellte Variable "Prozent" aus dem Dataframe "noten". 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("black", "black", "black", "white", "white", "white"
  • Den Rahmen entfernt man über label.size=0
  • Die Schriftgröße erhöht man mit size=3 auf z.B. 3.
  • Mit show.legend=FALSE entfernt man die Labels ("a) aus der von ggplot bereits erstellten Legende

ggplot(noten, aes(x="", y=Freq, fill=Var1))+
  geom_bar(stat="identity", color="black")+
  coord_polar("y")+
  theme_void()+
  scale_fill_manual(values = c("palegreen4", "palegreen3", "palegreen", 
                               "firebrick3", "firebrick", "firebrick4"))+
  geom_label(aes(label=Prozent),
             position = position_stack(vjust = 0.5),
             color=c("black", "black", "black", "white", "white", "white"),
             label.size = 0,
             size=3, 
             show.legend = FALSE)

 

Kreisdiagramm ggplot R

1.5 Legende anpassen

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


ggplot(noten, aes(x="", y=Freq, fill=Var1))+
  geom_bar(stat="identity", color="black")+
  coord_polar("y")+
  theme_void()+
  scale_fill_manual(values = c("palegreen4", "palegreen3", "palegreen", 
                               "firebrick3", "firebrick", "firebrick4"))+
  geom_label(aes(label=Prozent),
             position = position_stack(vjust = 0.5),
             color=c("black", "black", "black", "white", "white", "white"),
             label.size = 0,
             size=3, 
             show.legend = FALSE) 
  show.legend = FALSE)+
          labs(fill="Sportnote:")

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("palegreen4", "palegreen3", "palegreen", 
                               "firebrick3", "firebrick", "firebrick4"))+
  geom_label(aes(label=Prozent),
             position = position_stack(vjust = 0.5),
             color=c("black", "black", "black", "white", "white", "white"),
             label.size = 0,
             size=3.5, 
             show.legend = FALSE)+
  labs(fill="Spornote:")+
theme(legend.text = element_text(size=15),
     legend.title = element_text(size=15))

Kreisdiagramm ggplot R
 

2. Videotutorial zum Erstellen eines Kreisdiagramms in R mit ggplot

 

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.
Alternativ kannst du über meinen Amazon Affiliate-Link einkaufen – ohne Zusatzkosten.

Vielen Dank und viel Erfolg!

Über mich

Björn Walther

Ein 💚 für Statistik & Datenanalyse

Excel Online-Kurs

YouTube-Kanal

Inhalt