ggplot2: Einführung in die drei Basisschichten – Daten, Ästhetiken, Geometrien

ggplot2 und die Grammatik der grafischen Darstellung

ggplot2 ist der de-facto-Standard, um professionelle, ansprechende Grafiken in R zu erstellen. Heute sehen wir uns die drei Basisschichten an, die für jede ggplot2-Grafik erforderlich sind.

ggplot2 basiert auf der Grammatik der grafischen Darstellung (Grammar of Graphics), die auf Leland Wilkinson zurückgeht. Er beschrieb das Konzept unabhängig von R in seinem Buch von 1999 (siehe unten).

Niemand muss sich vom Begriff Grammatik abschrecken lassen – schöne Grafiken mit ggplot2 zu erstellen ist deutlich einfacher, als eine Fremdsprache zu erlernen. Insbesondere, da es eine grafische Oberfläche gibt, mit der man per Mausklick die ersten Schritte gehen kann:

Hadley Wickham, der Autor des ggplot2-Pakets, hat folgenden Artikel veröffentlicht: A layered grammar of graphics, Journal of Computational and Graphical Statistics, 2010. Man muss allerdings weder das Buch noch den Artikel gelesen haben, um loslegen zu können:

Grundideen der Grammar of Graphics: Sieben Schichten

  • Grafiken werden aus Schichten „grammatischer Elemente“ aufgebaut
  • Variablen werden auf Ästhetiken bezogen („aesthetic mapping“)
  • Insgesamt gibt es sieben Schichten

Von den sieben Schichten sind drei essentiell, d. h. sie müssen für jede Grafik angegeben werden:

  1. Daten
  2. Ästhetiken: Skalen, die wir Daten zuordnen
  3. Geometrien: Visuelle Elemente, die Daten darstellen

Die weiteren („fortgeschrittenen“) Schichten sind optional und Thema eines folgenden Beitrags – schon mal als Ausblick: 4. Facetten (Facets); 5. Statistische Transformationen; 6. Koordinatensysteme; 7. Themes (Stile, „Non-Data Ink – Tinte, die keine Daten darstellt“).

1. Schicht: Daten

Im Folgenden laden wir das tidyverse – ein Meta-Paket, das neben anderen nützlichen Erweiterungspaketen auch ggplot2 enthält. Darin findet sich der Datensatz diamonds.

library(tidyverse)
data(diamonds)
ggplot(data = diamonds)

Die Daten allein anzugeben, reicht nicht aus, um eine Grafik zu erstellen. Immerhin erhalten wir schon mal einen grau hinterlegten Diagrammbereich:

ggplot2: Die Angabe des Datensatzes allein genügt nicht für eine grafische Darstellung.

2. Schicht: Ästhetiken

Zusätzlich zum Datensatz müssen wir angeben, welche Variablen auf welche Ästhetiken bezogen werden. Hier machen wir es uns einfach: Wir geben nur eine Ästhetik an, und zwar die Variable, die auf der x-Achse gezeigt werden soll:

ggplot(diamonds,
       aes(x = cut))
ggplot2: Daten und x-Ästhetik, aber keine Geometrie: Wir sehen ein (minimales) Koordinatensystem, zumindest mit x-Achse.

Weitere Ästhetiken:

  • y-Achse
  • Farbe (color), Füllung (fill)
  • Größe (size)
  • Beschriftungen (labels)
  • Transparenz (alpha): ein gutes Mittel, um mit Overplotting (sich überlappende Datenpunkte) umzugehen, etwa in Streudiagrammen bei großen Datenmengen
  • Form (shape)
  • Linientyp (line type), Linienstärke (line width)

Es gibt prinzipiell keine Grenze, wie viele Ästhetiken in einer Grafik verwendet werden können. Häufig werden neben den Variablen, die den Achsen zugeordnet werden, weitere Variablen über Farben, Formen oder Größen codiert.

3. Schicht: Geometrie („Diagrammtyp“)

Eine umgangssprachliche Übersetzung für die zunächst etwas sperrige Bezeichnung „Geometrie“ lautet: Diagrammtyp. Wir müssen ggplot2 mitteilen, auf welche Art die Daten visualisiert werden sollen. Wieder machen wir es uns einfach: Wir nehmen ein Balkendiagramm, ohne weitere Funktionsparameter.

ggplot(diamonds, aes(x = cut)) +
  geom_bar()

Nun haben wir ein gültiges Diagramm:

Mit Angabe von Daten, Ästhetiken (hier: nur x) und Geometrie (hier: geom_bar()) erhalten wir ein sinnvolles ggplot2-Diagramm.

geom_bar() führt automatisch eine Datenaggregation aus und zählt die Einträge je Kategorie. Die Diamanten werden nach cuts unterschieden, von Fair bis Ideal. Die y-Achse wird automatisch mit count (Anzahl) beschriftet, die x-Achse mit dem Variablennamen cut.

Praktisch: Geometrien beginnen in ggplot2 mit dem geom_ -Präfix. Dadurch erhalten wir in RStudio durch Eingabe von ?geom_ ein Kontextmenü mit einer schnellen Übersicht:

Dank des Präfixes geom_ zeigt RStudio ein Kontextmenü mit einer Übersicht über die Geometrien (Diagrammtypen), die ggplot2 anbietet. Weitere Geometrien werden von Erweiterungspaketen ergänzt.

Es gibt bereits über 50 Geometrien allein in ggplot2. Weitere werden über Zusatzpakete ergänzt. Anregungen siehe ggplot2 Extensions Gallery.

Das Diagramm verbessern: Sinnvolle Beschriftungen

Warum ist es nicht nur sinnvoll, sondern sogar wichtig, Diagramme und insgesondere die Achsen sorgfältig zu beschriften? Nun, im schlimmsten Fall kann Nachlässigkeit zum Verlust der Beziehung führen:

xkcd: A webcomic of romance, sarcasm, math, and language. Immer einen Besuch wert.

Wir wollen also die Beschriftung unseres Minimal-Beispiels ein wenig aufpolieren:

ggplot(diamonds, aes(x = cut)) +
  geom_bar() +
  labs(title = "Quality of cuts",
       x = "Cut", y = "N",
       caption = "Diamonds dataset, ggplot2")

Nun sieht das Diagramm so aus:

ggplot2: Minimales Beispiel inklusive Achsenbeschriftungen, Titel und Bildunterschrift zur Datenquelle

Beim nächsten Mal nehmen wir uns die vier fortgeschrittenen Schichten im Schnelldurchlauf vor. Viel Erfolg bei Euren Datenvisualisierungen!

Die aktuelle Version des ggplot2-Buchs von Hadley gibt es kostenlos online zu lesen.

2 Gedanken zu „ggplot2: Einführung in die drei Basisschichten – Daten, Ästhetiken, Geometrien“

Freue mich über Kommentare!