ggplot2 Basics

Begleitend zur Vorlesung – Grammatik der Grafik zum Selberbauen

Komplexe Forschungsmethoden
ggplot2
Interaktiv
Autor:in

Gerrit Hirschfeld

Veröffentlichungsdatum

9. September 2026

HinweisSo funktioniert diese Übung

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:

Variablen im Datensatz anxiety
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:

  1. Daten – der Data-Frame (anxiety).
  2. Aesthetics (aes()) – welche Variable beschreibt welchen visuellen Aspekt (x-Achse, y-Achse, Farbe, …)?
  3. 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.

Tipp🎯 Aufgabe 1

Ergänze das passende Geom, damit die Prüfungsangst (x) gegen die Note (y) als Punktwolke dargestellt wird.

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").)

Tipp🎯 Aufgabe 2

Färbe die Punkte nach Gender ein.

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.

Tipp🎯 Aufgabe 3

Ergänze eine lineare Regressionslinie ohne Konfidenzintervall.

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).

Tipp🎯 Aufgabe 4

Ersetze die Standardfarben durch die viridis-Palette.

Häng einfach eine weitere Zeile an: + scale_color_viridis_d().

WichtigNebenbei: Vorsicht bei Achsen-Limits

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.

Tipp🎯 Aufgabe 5

Erstelle je eine getrennte Abbildung für viel- und wenig-wiederholende Schüler:innen (reviser).

+ 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.

Tipp🎯 Aufgabe 6

Gib der Abbildung ein aufgeräumtes Aussehen mit theme_bw().

+ 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.

Tipp🎯 Aufgabe 7

Gib der Abbildung einen Titel und beschrifte die Achsen sowie die Legende auf Deutsch.

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.

Tipp🎯 Aufgabe 8

Stelle den Zusammenhang zwischen Revise (x) und Exam (y) dar:

  • als Punktwolke,
  • eingefärbt nach Gender (viridis),
  • mit linearer Trendlinie ohne Konfidenzband,
  • mit theme_minimal(),
  • und sinnvollen Achsenbeschriftungen.

Fang mit ggplot(anxiety, aes(...)) an.

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.

Tipp🎯 Aufgabe (optional)

Ändere die x-Achse so, dass ängstliche vs. entspannte Schüler:innen (anxious) verglichen werden, statt Gender.

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 ggplot2 gut funktioniert, sollten die Daten tidy sein – jede Variable eine Spalte, jede Beobachtung eine Zeile. Für „mehrere Variablen als Facets” muss man vorher oft mit pivot_longer() ins lange Format umformen (wie oben bei Anscombe).

Hilfreiche Anlaufstellen zum Weiterüben:

HinweisFazit
  • Abbildungen sind zentral, um Daten zu verstehen – nicht nur, um sie zu präsentieren.
  • Gute Grafiken kombinieren Rohdaten und Statistiken über verschiedene Abstraktionsebenen.
  • ggplot2 erlaubt es, Schicht für Schicht immer bessere Grafiken zu bauen.

Referenzen

Anscombe, F. J. count. (1973). Graphs in statistical analysis. The American Statistician, 27(1), 17–21.
Tufte, E. R. (2006). Beautiful Evidence. In Connecticut: Graphics Press Llc. Graphics press Cheshire, CT.
Wickham, H. (2009). ggplot2 - Elegant Graphics for Data Analysis. Springer.
Wilkinson, L. (2012). The Grammar of Graphics. In Handbook of Computational Statistics. Springer. https://doi.org/10.1007/978-3-642-21551-3_13