for (pkg in c("ggplot2", "scales", "RColorBrewer", "MetBrewer", "viridis")) {
if (!require(pkg, character.only = TRUE)) install.packages(pkg)
}Farbe ist eines der mächtigsten Werkzeuge in der Datenvisualisierung. Ein gut gewähltes Farbschema kann Gruppenunterschiede hervorheben, die Aufmerksamkeit des Lesers lenken und einen Plot sofort zugänglich machen. Ein schlecht gewähltes kann Muster verschleiern, Leser verwirren oder Menschen mit Farbfehlsichtigkeit ausschließen.
In ggplot2 kann man visuelle Eigenschaften wie Farbe, Form, Größe und Transparenz auf zwei grundsätzlich verschiedene Arten festlegen: als statische Werte (gleich für alle Datenpunkte) oder dynamisch gemappt auf Variablen in den Daten über aes(). Diese Unterscheidung zu verstehen ist wesentlich - sie bestimmt, ob eine visuelle Eigenschaft rein kosmetisch ist oder tatsächlich Informationen kodiert.
Wir arbeiten weiter mit dem verfeinerten Plot aus dem vorherigen Kapitel:
myplot <- ggplot(data = PlantGrowth) +
aes(y = weight, x = group) +
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"
)
) +
theme_classic()Statische Aesthetics
Wenn man ästhetische Eigenschaften direkt in einer geom_*()-Funktion setzt - aber außerhalb von aes() - gelten sie einheitlich für alle Datenpunkte. Das ist der einfachere der beiden Ansätze: Man wählt eine feste Farbe, Form oder Größe, und jeder Punkt sieht gleich aus. Das ist nützlich, wenn die Gruppierung bereits über die Achse vermittelt wird (wie in unserem Plot, wo die Gruppen entlang der x-Achse getrennt sind) und zusätzliche Farbkodierung redundant wäre.
Im ersten Plot sind alle Punkte orange. Im zweiten werden mehrere Eigenschaften gleichzeitig modifiziert: lila Farbe, Diamantform (18), größere Punkte und 50% Transparenz. Man beachte, dass diese Änderungen rein kosmetisch sind - sie kodieren keine Informationen aus den Daten.
Aesthetic Mapping mit aes()
Die eigentliche Stärke von ggplot2 liegt im dynamischen Mapping über aes(). Anstatt eine feste Farbe für alle Punkte zu setzen, kann man eine Variable auf die Farb-Aesthetic mappen, sodass jede Gruppe automatisch ihre eigene Farbe erhält. So sagt man ggplot2: „Verwende Farbe, um die Gruppierung in meinen Daten darzustellen.”
Ein wichtiges Detail: aes() und data kann man entweder global in ggplot() (gilt für alle Layer) oder lokal innerhalb einer bestimmten geom_*()-Funktion (gilt nur für diesen Layer) definieren. Für einfache Plots mit einem einzelnen Geom erzeugen beide dasselbe Ergebnis. Die Unterscheidung wird wichtig, wenn man mehrere Geoms mit unterschiedlichen Datenquellen kombiniert - eine Technik, die wir in späteren Kapiteln verwenden werden.
Mehrere Aesthetics können gleichzeitig gemappt werden. Das ist nützlich, wenn ein einzelner visueller Kanal nicht ausreicht - beispielsweise liefert das gleichzeitige Mappen von Farbe und Form auf dieselbe Variable eine redundante Kodierung, die farbenblinden Lesern hilft. Hier hängen Farbe und Form von group ab, während Größe und Transparenz von weight abhängen:
Genau wie scale_x_* und scale_y_* das Achsenaussehen steuern, gibt es Scale-Funktionen für jede Aesthetic. Diese bieten die vollständige Kontrolle über das Mapping:
Farbpaletten
Einzelne Farben manuell aus langen Listen auszuwählen ist mühsam und führt oft zu Kombinationen, die visuell kollidieren oder schwer zu unterscheiden sind. Ein besserer Ansatz sind kuratierte Farbpaletten - vordefinierte Farbsets, die so gestaltet sind, dass sie harmonisch, unterscheidbar und oft auch für Menschen mit Farbfehlsichtigkeit zugänglich sind.
Es gibt zwei generelle Ansätze: Man kann einen Farbvektor aus einer Palette erzeugen und an scale_color_manual() übergeben, oder man verwendet eine dedizierte scale_color_*()-Funktion, die die Palette direkt anwendet. Beide Varianten werden unten gezeigt.
RColorBrewer
Das {RColorBrewer}-Paket bietet eine bewährte Sammlung von Paletten, die ursprünglich für Kartografie entworfen, aber in allen Fachbereichen weit verbreitet sind. Es stellt drei Palettentypen bereit: sequentiell (für geordnete Daten), divergierend (für Daten mit einem aussagekräftigen Mittelpunkt) und qualitativ (für kategorische Gruppen wie unsere).
color_vector <- RColorBrewer::brewer.pal(3, "Dark2")
myplot +
geom_point(aes(color = group), size = 5) +
scale_color_manual(values = color_vector)MetBrewer
Das {MetBrewer}-Paket bietet Paletten, die von Kunstwerken des Metropolitan Museum of Art inspiriert sind.
color_vector <- MetBrewer::met.brewer("VanGogh2", 3)
myplot +
geom_point(aes(color = group), size = 5) +
scale_color_manual(values = color_vector)Farbenblind-freundlich: viridis
Wenn man Plots für Publikation oder Präsentation erstellt, sollte Barrierefreiheit bei Farben kein Nachgedanke sein. Etwa 8% der Männer und 0,5% der Frauen haben eine Form von Farbfehlsichtigkeit. Die viridis-Palettenfamilie ist speziell so gestaltet, dass sie perzeptuell gleichmäßig (gleiche Schritte in den Daten erzeugen gleiche visuelle Schritte) und für die häufigsten Formen von Farbenblindheit zugänglich ist.
Corporate Design
In der Praxis ist die Farbwahl oft gar nicht frei - viele Organisationen haben einen Corporate-Design-Leitfaden, der exakte Hex-Farben für alle Grafiken vorschreibt. In solchen Fällen definiert man einfach die vorgegebenen Farben und übergibt sie über scale_color_manual(). Das Corporate-Grün von BioMath ist beispielsweise #00923f:
myplot +
geom_point(aes(color = group), size = 5) +
scale_color_manual(values = c("#00923f", "#201E50", "#AAAAAA"))Color vs. fill
Ein häufiger Stolperstein - besonders für Einsteiger - ist der Unterschied zwischen color und fill. Die Regel ist einfach: color steuert die Umrandung eines Geoms (Punkte, Linien, Ränder von Balken), während fill das Innere steuert (die gefüllte Fläche von Balken, Boxplots, Violin Plots und bandartigen Geoms). Die entsprechenden Scale-Funktionen folgen demselben Muster: Alles was wir oben mit scale_color_*() behandelt haben, funktioniert identisch mit scale_fill_*().
Die Unterscheidung ist besonders wichtig bei Geoms, die sowohl eine Umrandung als auch ein Inneres haben, wie geom_boxplot() oder geom_col(). Dort mappt man typischerweise fill auf eine Gruppierungsvariable (um den Körper jedes Balkens oder Boxplots einzufärben), während man color beim Standard belässt.
Zitat
@online{schmidt2026,
author = {{Dr. Paul Schmidt}},
publisher = {BioMath GmbH},
title = {2. Farben, Formen und Paletten},
date = {2026-08-13},
url = {https://biomathcontent.netlify.app/de/content/ggplot2/02_colors.html},
langid = {de}
}











