for (pkg in c("ggplot2", "showtext", "ggtext")) {
if (!require(pkg, character.only = TRUE)) install.packages(pkg)
}Alles was wir bisher getan haben - Achsen, Farben, Formen - betrifft die Darstellung der Daten. Die theme()-Funktion steuert dagegen alle nicht-datenbezogenen visuellen Elemente: Hintergründe, Gitterlinien, Achsenlinien, Textformatierung, Legenden, Abstände und mehr. Diese Elemente tragen zwar keine Daten, haben aber einen enormen Einfluss darauf, wie professionell und lesbar ein Plot wirkt.
Themes zu beherrschen ist das, was einen schnellen explorativen Plot von einer publikationsreifen Grafik trennt. Die gute Nachricht: ggplot2 macht das bemerkenswert systematisch - es gibt nur vier Typen von Theme-Elementen zu lernen und eine Handvoll Complete Themes, die sinnvolle Ausgangspunkte bieten.
Wir arbeiten weiter mit dem PlantGrowth-Plot aus den vorherigen Kapiteln:
myplot <- ggplot(data = PlantGrowth) +
aes(y = weight, x = group) +
geom_point() +
scale_y_continuous(
name = "Gewicht (g)",
limits = c(0, NA),
breaks = seq(0, 6),
expand = expansion(mult = c(0, 0.05))
) +
scale_x_discrete(
name = "Behandlungsgruppe",
labels = c(
ctrl = "Kontrolle",
trt1 = "Behandlung 1",
trt2 = "Behandlung 2"
)
)Fertige Themes
Anstatt jedes visuelle Detail von Grund auf zu konfigurieren, bringt ggplot2 mehrere vordefinierte “Complete Themes” mit, die das gesamte Erscheinungsbild in einem Schritt ändern. Der Standard ist theme_grey() - erkennbar an seinem grauen Hintergrund und weißen Gitterlinien. Funktional, aber selten das, was man in einem Bericht oder einer Publikation möchte. Hier sind einige beliebte Alternativen:
Alle Complete Themes akzeptieren ein base_size-Argument, das alle Textelemente proportional skaliert. Das ist besonders nützlich, wenn man Plots für Präsentationen (größer) vs. Publikationen (kleiner) vorbereitet:
Theme-Elemente anpassen
Ein Complete Theme bietet einen guten Ausgangspunkt, aber fast immer möchte man einzelne Details anpassen - vielleicht die Minor-Gitterlinien entfernen, die Achsenlinienfarbe ändern oder die Textgröße anpassen. Dafür ist theme() da. Entscheidend ist, zuerst ein Complete Theme anzuwenden und dann mit theme() spezifische Elemente zu überschreiben. Die Reihenfolge ist wichtig: theme()-Aufrufe nach einem Complete Theme überschreiben dessen Standards.
In der Praxis verwendet fast jede Theme-Anpassung einen dieser vier Elementtypen:
-
element_blank()- entfernt das Element vollständig -
element_rect()- für Ränder und Hintergründe -
element_line()- für Linien (Achsen, Gitter) -
element_text()- für alle Textelemente
(Seit ggplot2 3.5.0 gibt es zusätzlich element_polygon() und element_geom() für Spezialfälle, aber die vier oben decken die allermeisten Theme-Anpassungen ab.) Wenn man diese Bausteine kennt, ist jede Theme-Anpassung eine Frage des richtigen Elementnamens (wie plot.background, axis.line, panel.grid.major.y) und des passenden Elementtyps. Hier zwei bewusst übertriebene Beispiele zur Veranschaulichung:
Ein praktischeres Beispiel: Ausgehend von theme_classic() wird die x-Achsenlinie beibehalten und dezente horizontale Gitterlinien hinzugefügt:
Google Fonts mit showtext
Die Standardschriften in R-Plots sind auf wenige Systemschriften beschränkt. Für publikationsreife Grafiken benötigt man oft eine bestimmte Schriftart - sei es passend zum Corporate Design, zum Journal-Stil oder einfach für einen saubereren Look. Das {showtext}-Paket löst dieses Problem, indem es jede Google Font in ggplot2 verfügbar macht.
Der Workflow hat drei Schritte:
-
sysfonts::font_add_google()lädt die Schriftart herunter -
showtext::showtext_auto()aktiviert das Rendering benutzerdefinierter Schriften -
showtext::showtext_opts(dpi = 300)stellt die korrekte Auflösung sicher
sysfonts::font_add_google("Kanit", "kanit")
showtext::showtext_auto()
showtext::showtext_opts(dpi = 300)Der showtext_opts(dpi = 300)-Aufruf ist wichtig: showtext nutzt standardmäßig 72 dpi, während ggsave() standardmäßig 300 dpi verwendet. Ohne diese Abstimmung erscheinen Schriften in exportierten Plots in der falschen Größe.
font_add_google() benötigt eine Internetverbindung, um die Schriftart herunterzuladen. Wenn der Download fehlschlägt (langsames Netzwerk, Firewall, Offline-Arbeit), steht die Schriftart nicht zur Verfügung und Plots erzeugen einen Fehler oder fallen auf eine Standardschrift zurück. Für Offline-Arbeit kann man die .ttf-Datei manuell von Google Fonts herunterladen und stattdessen sysfonts::font_add() mit einem lokalen Dateipfad verwenden.
Nach der Einrichtung kann die Schriftart in theme() über das family-Argument in element_text() verwendet werden:
myplot +
labs(title = "PlantGrowth-Experiment") +
theme_minimal(base_size = 14) +
theme(
text = element_text(family = "kanit"),
plot.title = element_text(face = "bold", size = 16),
plot.title.position = "plot"
)Beim Rendern in Quarto benötigt man fig-showtext: TRUE in den knitr-Optionen (oder als Chunk-Option #| fig-showtext: true), damit showtext-Schriften korrekt gerendert werden.
Formatierter Text mit ggtext
Standard-ggplot2-Textelemente unterstützen nur einfachen Text - man kann keine fetten, kursiven oder farbigen Wörter innerhalb eines Titels verwenden. Das {ggtext}-Paket hebt diese Einschränkung auf, indem es HTML- und Markdown-Formatierung in Plot-Titeln, Untertiteln, Achsenbeschriftungen und Annotationen erlaubt.
Das Paket stellt zwei Ersatzfunktionen für element_text() bereit:
-
ggtext::element_markdown()— für einzeiligen Text (Titel, Achsenbeschriftungen). Rendert HTML/Markdown inline. -
ggtext::element_textbox_simple()— für mehrzeiligen Text mit automatischem Zeilenumbruch (Untertitel, Bildunterschriften).
Ein normales element_text() rendert keine Formatierung — HTML-Tags würden als wörtlicher Text erscheinen.
Die Formatierung selbst verwendet einfaches HTML: <b>fett</b> für Fettdruck, <i>kursiv</i> für Kursivschrift, und <b style='color:#00923f;'>grüner Fettdruck</b> für farbigen Text. Man muss kein HTML beherrschen — diese wenigen Tags decken die meisten Anwendungsfälle ab.
Hier ein vollständiges Beispiel, das die Legende durch farbcodierten Text im Untertitel ersetzt:
myplot +
aes(color = group) +
scale_color_manual(
values = c(ctrl = "#00923f", trt1 = "#201E50", trt2 = "#201E50"),
guide = "none"
) +
labs(
title = "PFLANZENWACHSTUM",
subtitle = "Vergleich der <b style='color:#00923f;'>Kontrollpflanzen</b> mit zwei <b style='color:#201E50;'>Behandlungen</b>"
) +
theme_minimal(base_size = 14) +
theme(
text = element_text(family = "kanit"),
plot.title = element_text(face = "bold", size = 16),
plot.title.position = "plot",
plot.subtitle = ggtext::element_textbox_simple(
size = 11,
margin = margin(0, 0, 5, 0)
)
)Diese Technik wird besonders mächtig, wenn man die Legende durch farbcodierten Text im Untertitel ersetzt - diesen Ansatz werden wir in den nächsten Kapiteln intensiv nutzen, um visuelle Unordnung zu reduzieren.
Eigene Theme-Funktion erstellen
Wenn man an einem Projekt mit mehreren Plots arbeitet, stellt man schnell fest, dass dieselben Theme-Einstellungen immer wieder kopiert werden. Das ist sowohl mühsam als auch fehleranfällig - eine Detailänderung bedeutet, jeden Plot zu aktualisieren. Ein besserer Ansatz ist, die Theme-Einstellungen in eine eigene Funktion zu verpacken, was den Code DRY (Don’t Repeat Yourself) hält und visuelle Konsistenz über alle Plots sicherstellt:
theme_clean <- function(base_size = 12) {
theme_minimal(base_size = base_size) +
theme(
text = element_text(family = "kanit"),
plot.title.position = "plot",
plot.title = element_text(face = "bold", size = base_size + 4),
plot.subtitle = ggtext::element_textbox_simple(
size = base_size,
margin = margin(0, 0, 8, 0)
),
panel.grid.minor = element_blank(),
panel.grid.major.y = element_blank(),
panel.grid.major.x = element_line(
linetype = "dotted", color = "#AAAAAA", linewidth = 0.3
),
axis.line.x = element_line(color = "black", linewidth = 0.6),
axis.ticks.x = element_line(color = "#AAAAAA", linewidth = 0.4)
)
}
myplot +
labs(title = "Ein sauberer Look") +
theme_clean()Wiederkehrende theme()-Anpassungen wie hier in einer benannten Funktion zu bündeln, ist ein Muster, das in den folgenden Kapiteln wieder aufgegriffen wird, wo jeder Plot sein eigenes maßgeschneidertes Theme erhält.
Zitat
@online{schmidt2026,
author = {{Dr. Paul Schmidt}},
publisher = {BioMath GmbH},
title = {3. Themes},
date = {2026-08-13},
url = {https://biomathcontent.netlify.app/de/content/ggplot2/03_themes.html},
langid = {de}
}










