ggplot2 Basics
Begleitend zur Vorlesung – Grammatik der Grafik zum Selberbauen
Auf dieser Seite läuft ein komplettes R direkt in deinem Browser – du brauchst weder eine Installation noch einen Server. Beim ersten Laden dauert es ein paar Sekunden, bis unten “R is ready!” erscheint (R und die Pakete werden einmalig heruntergeladen).
Jede Code-Zelle hat einen Run code-Knopf. Du kannst den Code beliebig verändern und erneut ausführen. Genau das ist der Sinn der Sache: ausprobieren, kaputtmachen, verstehen. Zu jeder Aufgabe gibt es einen aufklappbaren Tipp und eine Lösung – schau aber erst selbst, wie weit du kommst.
Warum überhaupt visualisieren?
Bevor wir Code schreiben, eine kurze Erinnerung, warum wir uns die Mühe machen. Zusammenfassende Statistiken (Mittelwert, Korrelation, Regressionskoeffizient) sind praktisch – aber sie können dieselben Kennwerte für völlig verschiedene Daten liefern. Das berühmteste Beispiel ist Anscombe’s Quartett (Anscombe, 1973): vier Datensätze mit identischem Mittelwert, identischer Korrelation und identischer Regressionsgerade, die aber völlig unterschiedlich aussehen. Ganz am Ende dieser Übung kannst du das selbst nachzeichnen.
Die Kernidee von Grafiken nach Tufte (Tufte, 2006): die Daten zeigen, die Lesenden zum Nachdenken bringen, nichts verzerren und viele Zahlen mit möglichst wenig Tinte darstellen. ggplot2 (Wickham, 2009) ist die Umsetzung der Grammar of Graphics (Wilkinson, 2012) in R – der Versuch, alle möglichen Grafiken über ein paar wenige Bausteine zu beschreiben, statt eine Liste fertiger Diagrammtypen anzubieten.
Der Datensatz
Wir arbeiten mit dem Datensatz anxiety aus der Vorlesung. Er enthält Daten von 103 Schüler:innen mit u.a. folgenden Variablen:
| Variable | Bedeutung |
|---|---|
Anxiety |
Ausmaß der Prüfungsangst |
Exam |
Prüfungsnote (in %) |
Revise |
Wie viel wurde wiederholt? |
Gender |
Geschlecht |
reviser |
Über-/unterdurchschnittliches Wiederholen |
Der Datensatz ist bereits geladen. Schau ihn dir an:
Probier es selbst: Verschaff dir mit weiteren Funktionen einen Überblick. Praktisch sind z.B. summary(), str(), nrow() oder dplyr::glimpse().
Baustein 1–3: Daten, Aesthetics, Geoms
Jede ggplot-Abbildung braucht mindestens drei Zutaten:
- Daten – der Data-Frame (
anxiety). - Aesthetics (
aes()) – welche Variable beschreibt welchen visuellen Aspekt (x-Achse, y-Achse, Farbe, …)? - Geoms – welche geometrischen Objekte werden gezeichnet (Punkte, Linien, Boxen …)?
Diese Bausteine werden mit + zu Schichten (Layers) zusammengesetzt.
Die folgende Zelle definiert schon Daten und Aesthetics – aber es fehlt das Geom. Führe sie aus: Du siehst nur eine leere „Leinwand” mit Achsen, aber keine Punkte.
Layers hängst du mit + an. Das Geom für einzelne Punkte heißt geom_point(). Schreibe das + am Ende der ersten Zeile, dann geom_point() in die nächste.
Schön sichtbar: Wer mehr Prüfungsangst hat, schneidet tendenziell schlechter ab.
Weitere Aesthetics: Farbe
Aesthetics sind nicht nur x und y. Jede Variable kann auf einen visuellen Aspekt gemappt werden – z.B. die Farbe der Punkte. Wichtig: Wenn Farbe von einer Variable abhängen soll, gehört sie in die aes(). (Eine feste Farbe für alle Punkte käme dagegen außerhalb von aes(), z.B. geom_point(color = "blue").)
Das Farb-Mapping gehört in die aes()-Klammer: aes(x = Anxiety, y = Exam, col = Gender).
Weitere Geoms: eine Regressionslinie
Man kann mehrere Geoms übereinanderlegen. Neben geom_* gibt es stat_* – das sind Geoms, die aus den Daten berechnet werden, z.B. Mittelwerte oder Regressionsgeraden. stat_smooth() legt eine Trendlinie über die Punkte.
stat_smooth() bekommt zwei Argumente: method = "lm" für eine Gerade und se = FALSE, um das graue Konfidenzband auszublenden.
Weil col = Gender in der aes() steht, bekommt jede Gruppe automatisch ihre eigene Linie. Das ist die Grammatik in Aktion.
Baustein 4: Scales
Scales steuern, wie Variablen auf visuelle Größen abgebildet werden – z.B. welche Farbpalette, welcher Achsenbereich, linear oder logarithmisch. Eine sehr empfehlenswerte Farbpalette ist viridis: gut unterscheidbar, auch bei Farbfehlsichtigkeit und in Schwarz-Weiß. Für diskrete Variablen heißt sie scale_color_viridis_d() (das d steht für discrete).
Häng einfach eine weitere Zeile an: + scale_color_viridis_d().
Scales steuern auch den Wertebereich der Achsen – und da lauert eine Falle. ylim(3500, 7000) entfernt alle Datenpunkte außerhalb dieses Bereichs, bevor z.B. Mittelwerte berechnet werden – das kann Ergebnisse dramatisch verändern! Wer nur „hineinzoomen” möchte, ohne Daten zu löschen, nutzt coord_cartesian(ylim = c(...)). Mehr dazu in den begleitenden Blogeinträgen zur Skalierung.
Baustein 5: Facets
Facets (aka small multiples) wiederholen dieselbe Abbildung für verschiedene Subgruppen und stellen sie nebeneinander. Tufte nennt das die visuelle Antwort auf die Kernfrage jeder quantitativen Argumentation: „Compared to what?“
facet_wrap(~ variable) teilt nach einer Variable auf; facet_grid(zeile ~ spalte) nach zwei.
+ facet_wrap(~ reviser). Die Tilde ~ bedeutet „aufgeschlüsselt nach”.
Experimentiere ruhig: Was passiert mit facet_grid(Gender ~ reviser) oder mit facet_wrap(~ reviser, scales = "free")?
Baustein 6: Themes
Themes steuern das gesamte Aussehen abseits der Daten – Hintergrund, Gitter, Schriftart. Fürs Erste sind theme_bw() (kontrastreich, schwarz-weiß) oder theme_minimal() sehr brauchbar.
+ theme_bw(). Probiere danach auch theme_minimal(), theme_classic(), theme_void().
Beschriftung: labs()
Für eine vorzeigbare Abbildung fehlen noch aussagekräftige Beschriftungen. labs() setzt Titel und Achsenbeschriftungen in einem Rutsch.
labs() nimmt Argumente wie title =, x =, y = und col = (für die Legendenüberschrift), z.B. labs(title = "…", x = "Prüfungsangst", y = "Note (%)").
🏆 Alles zusammen: die Capstone-Aufgabe
Jetzt ohne Gerüst. Baue eine vollständige Abbildung von Grund auf – nutze alles, was du gelernt hast.
Es gibt nicht die eine richtige Lösung – Hauptsache, die Bausteine stimmen.
Bonus 1: Mittelwerte statt Rohdaten
Nicht immer will man Rohdaten zeigen. stat_summary() fasst pro Gruppe zusammen, z.B. als Balken (Mittelwert) mit Fehlerbalken (Standardfehler). Hier siehst du auch, wie eine Statistik-Transformation und ein Geom kombiniert werden.
Ersetze an beiden Stellen Gender durch anxious (also in x = und fill =).
Bonus 2: Anscombe’s Quartett
Zum Abschluss der Klassiker aus der Einleitung: vier Datensätze mit identischen Kennwerten, aber völlig unterschiedlicher Struktur. Führe die Zelle aus – und du verstehst sofort, warum wir zuerst zeichnen und dann rechnen.
Und dann?
Ein paar Dinge, die in dieser Übung bewusst nur kurz vorkamen:
- Abbildungen speichern: In R (nicht im Browser) speicherst du mit
ggsave("abbildung.png", width = 90, height = 60, units = "mm"). - Mehrere Panels kombinierst du mit dem Paket patchwork oder cowplot.
- Tidy Data: Damit
ggplot2gut funktioniert, sollten die Daten tidy sein – jede Variable eine Spalte, jede Beobachtung eine Zeile. Für „mehrere Variablen als Facets” muss man vorher oft mitpivot_longer()ins lange Format umformen (wie oben bei Anscombe).
Hilfreiche Anlaufstellen zum Weiterüben:
- Beispiele: http://www.cookbook-r.com/Graphs
- Vollständige Doku: https://ggplot2.tidyverse.org/
- Cheat-Sheet: https://rstudio.github.io/cheatsheets/data-visualization.pdf
- Abbildungen sind zentral, um Daten zu verstehen – nicht nur, um sie zu präsentieren.
- Gute Grafiken kombinieren Rohdaten und Statistiken über verschiedene Abstraktionsebenen.
ggplot2erlaubt es, Schicht für Schicht immer bessere Grafiken zu bauen.