Herzlichen Dank an Joachim Schork für diesen Gastbeitrag auf meinem Youtube-Kanal!
Balkendiagramme in Base R
In Base R lautet die Funktion zum Erstellen von Balken- oder Säulendiagrammen schlicht barplot:
# Beispieldaten erstellen df1 <- data.frame(values = c(5, 2, 7, 2), group = LETTERS[1:4]) # Simples Balkendiagramm barplot(values ~ group, df1) # Horizontale Darstellung barplot(values ~ group, df1, horiz = TRUE) # Unterschiedliche Farben barplot(values ~ group, df1, col = 1:4) # Legende ergänzen legend("topright", df1$group, fill = 1:4)
So sieht das letzte Beispiel mit Farben und Legende aus:
Ich bevorzuge allerdings das ggplot2-Erweiterungspaket, das an der grammar of graphics angelehnt ist und einige Vorteile mit sich bringt, wie etwa das Verwalten der Grafiken als Objekte, die jederzeit flexibel ergänzt und bearbeitet werden können, sowie die automatische Erstellung von Legenden.
Balkendiagramme mit ggplot2 erstellen
Vor der ersten Verwendung muss das Paket ggf. installiert werden – entweder einzeln oder, was durchaus empfehlenswert ist, gleich das gesamte tidyverse, eine praktische Paketsammlung zur Datenbearbeitung.
install.packages("ggplot2") # nur einmalig erforderlich # Alternative: install.packages("tidyverse") # installiert mehrere Pakete, inkl. ggplot2 library("ggplot2") # vor jeder Verwendung laden # geht auch ohne Anführungszeiten # Alternative: library(tidyverse) # lädt mehrere Pakete inkl. ggplot2
In ggplot2 werden Diagramme in Schichten aufgebaut. Die drei Basisschichten sind: Daten, Ästhetiken, Geometrien. Somit sieht der Code für ein simples Barplot so aus:
ggplot(df1, aes(x = group, y = values)) + geom_bar(stat = "identity") # Falls die Daten nicht aggregiert werden müssen, sondern die Balkenhöhe direkt enthalten, gibt es eine Abkürzung: ggplot(df1, aes(x = group, y = values)) + geom_col()
Möchte man die Achsen vertauschen, sodass das Diagramm horizontal dargestellt wird, gibt es zwei Möglichkeiten:
ggplot(df1, aes(x = group, y = values)) + geom_col() + coord_flip() # In neueren ggplot2-Versionen kann man auch einfach die Ästhetiken x und y vertauschen ggplot(df1, aes(y = group, x = values)) + geom_col()
Balkendiagramm mit farbigen Balken
Für farbige Balken geben wir lediglich die fill-Ästhetik an:
ggplot(df1, aes(x = group, y = values, fill = group)) + geom_col()
ggplot2 erstellt, im Gegensatz zu Base R, die Legende automatisch.
Gestapelte und gruppierte Balken
Zunächst legen wir einen erweiterten Datensatz sowie Untergruppen an:
df2 <- data.frame(values = c(3, 2, 6, 3, 4, 3, 8, 2), maingroup = rep(LETTERS[1:4], each = 2), subgroup = letters[1:2]) # Datensatz ausgeben df2
Gestapelte Balken:
ggplot(df2, aes(x = maingroup, y = values, fill = subgroup)) + geom_bar(stat = "identity") # Auf 1 skalieren ggplot(df2, aes(x = maingroup, y = values, fill = subgroup)) + geom_bar(stat = "identity", position = "fill")
Das zuletzt beschriebene Diagramm sieht so aus:
Wer die Beschriftung lieber in Prozent sieht, kann das mit dem scales-Paket bewerkstelligen:
ggplot(df2, aes(x = maingroup, y = values, fill = subgroup)) + geom_bar(stat = "identity", position = "fill") + scale_y_continuous(labels = scales::percent_format())
Zu guter Letzt noch ein gruppiertes Balkendiagramm:
ggplot(df2, aes(x = maingroup, y = values, fill = subgroup)) + geom_bar(stat = "identity", position = "dodge")
Ausblick
Auf dieser Basis kann man seine Diagramme verfeinern – Anregungen:
- Diagrammstil variieren, etwa mit anderen als dem voreingestellten theme; siehe ggplot2: Die vier fortgeschrittenen Schichten
- Farben variieren mit Funktionen wie scale_fill_discrete() oder scale_fill_manual()
- Statistische Tests ergänzen, z. B. ganz einfach mit dem ggstatsplot-Paket und der Funktion ggbarstats()
Es gibt einen dazu passenden englischsprachigen Artikel auf data-hacks.com.