HOWTO · R
ggplot2-Achsenbeschriftungen in R ändern
Diskrete und kontinuierliche Achsenbeschriftungen in ggplot2 umbenennen, formatieren, drehen oder gezielt ausblenden.
Mit scale_x_discrete(labels = ...) benennen Sie Teilstrichbeschriftungen für Faktor- oder Zeichenkettenwerte um. Für numerische Werte legen Sie mit scale_x_continuous(breaks = ..., labels = ...) die Position und Darstellung der Beschriftungen fest. Eine Drehung oder andere optische Anpassung gehört dagegen in theme(axis.text.x = element_text(...)). Soll nur der Achsentitel geändert werden, verwenden Sie labs(x = ...); der Achsentitel ist keine Teilstrichbeschriftung. Ersetzen Sie x durch y, um dieselben Regeln auf die vertikale Achse anzuwenden.
Die Beispiele benötigen R und ggplot2. Das Beispiel zur kontinuierlichen Skala nutzt zusätzlich das Paket scales für eine Formatierungsfunktion. Getestet wurden R 4.1.2, ggplot2 3.3.5 und scales 1.1.1. Die verwendeten Skalenargumente sind auch in der aktuellen ggplot2-API vorhanden; je nach installierter Version kann das Erscheinungsbild des Themes geringfügig abweichen.
| Aufgabe | ggplot2-Steuerelement |
|---|---|
| Achsentitel ändern | labs(x = "Title") oder labs(y = "Title") |
| Beschriftungen von Faktor- oder Zeichenkettenwerten ändern | scale_x_discrete(labels = ...) |
| Numerische Teilstriche positionieren und beschriften | scale_x_continuous(breaks = ..., labels = ...) |
| Angezeigten Text drehen oder gestalten | theme(axis.text.x = element_text(...)) |
Eine Date-Achse formatieren |
scale_x_date(breaks = ..., labels = ...) |
Ein ggplot2-Ausgangsdiagramm erstellen
Eine kleine gemeinsame Datenstruktur macht die Wirkung jeder Änderung nachvollziehbar. plan ist ein Faktor und erhält deshalb eine diskrete x-Skala. orders ist numerisch und wird auf einer kontinuierlichen y-Skala dargestellt.
library(ggplot2)
plan_sales <- data.frame(
plan = factor(
c("starter", "standard", "premium", "enterprise"),
levels = c("starter", "standard", "premium", "enterprise")
),
orders = c(180, 250, 210, 140)
)
base_plot <- ggplot(plan_sales, aes(x = plan, y = orders)) +
geom_col(fill = "#2c7fb8", width = 0.7) +
labs(x = "Plan", y = "Orders") +
theme_minimal(base_size = 16)
base_plot
ggsave(
"ggplot-default-axis-tick-labels.png",
plot = base_plot, width = 7.4, height = 4.82, dpi = 100, bg = "white"
)
Das Ausgangsdiagramm zeigt die vier gespeicherten Faktorwerte auf der x-Achse und automatisch gewählte numerische Teilstriche auf der y-Achse. labs(x = "Plan") setzt den sichtbaren Titel „Plan“, ändert aber nicht die Werte starter, standard, premium oder enterprise.
Prüfen Sie vor der Skalenwahl den Datentyp der zugeordneten Variable. str(plan_sales$plan) meldet einen Faktor, str(plan_sales$orders) einen numerischen Vektor. Auch ein Faktor mit den Zeichenwerten "1", "2" und "3" bleibt diskret. Umgekehrt bleibt eine numerische Spalte kontinuierlich, selbst wenn sie zurzeit nur wenige verschiedene Werte enthält. Ändern Sie den Typ nur, wenn die neue Darstellung der tatsächlichen Bedeutung der Daten entspricht.
Diskrete Beschriftungen umbenennen und anordnen
Verknüpfen Sie bei einer diskreten Skala breaks und labels. breaks nennt die zugrunde liegenden Datenwerte, für die Teilstriche erscheinen sollen; labels liefert den jeweils gedruckten Text. Die ausdrückliche Zuordnung verhindert, dass eine Beschriftung nach einer späteren Änderung der Reihenfolge am falschen Teilstrich landet.
Das nächste Beispiel ordnet zugleich die Kategorien sicher neu. Es ändert die Faktorstufen in einer Kopie der Daten und übergibt dieselbe Reihenfolge an breaks. Der benannte Vektor dokumentiert die Zuordnung bereits im Quelltext.
plan_order <- c("premium", "standard", "starter", "enterprise")
plan_names <- c(
premium = "Premium",
standard = "Standard",
starter = "Starter",
enterprise = "Enterprise"
)
ordered_sales <- plan_sales
ordered_sales$plan <- factor(ordered_sales$plan, levels = plan_order)
discrete_plot <- ggplot(ordered_sales, aes(x = plan, y = orders)) +
geom_col(fill = "#2c7fb8", width = 0.7) +
scale_x_discrete(
breaks = plan_order,
labels = plan_names[plan_order]
) +
labs(x = "Plan", y = "Orders") +
theme_minimal(base_size = 16)
discrete_plot
ggsave(
"ggplot-discrete-axis-tick-labels.png",
plot = discrete_plot, width = 7.4, height = 4.82, dpi = 100, bg = "white"
)
Die sichtbare Reihenfolge lautet Premium, Standard, Starter, Enterprise. Die gespeicherten Werte bleiben kleingeschrieben; geändert wird nur ihre Darstellung. Wenn dieselbe Regel für alle Werte gilt, kann labels auch eine Funktion erhalten. scale_x_discrete(labels = abbreviate) übergibt beispielsweise alle Werte an die R-Basisfunktion abbreviate(). Eine eigene function(x) muss einen Zeichenvektor derselben Länge zurückgeben.
Sollen nur die Namen geändert werden, während die vorhandene Reihenfolge erhalten bleibt, können Sie breaks weglassen und einen benannten Vektor für alle sichtbaren Werte übergeben, etwa c(starter = "Starter", standard = "Standard", premium = "Premium", enterprise = "Enterprise"). Die oben gezeigte Paarung eignet sich besser, wenn sowohl Auswahl als auch Reihenfolge feststehen. Prüfen Sie das Ergebnis nach dem Filtern von links nach rechts; die erwartete Folge steht zusätzlich im Text und hängt nicht von Farbe oder Gestaltung ab.
breaks und limits sind nicht austauschbar. Auf einer diskreten Skala wählt breaks die angezeigten Teilstriche, ohne die akzeptierten Kategorien zu verändern. limits legt dagegen erlaubte Werte und ihre Reihenfolge fest. Werte außerhalb dieser Grenzen werden zu fehlenden Werten; eine Ebene wie geom_col() kann die betreffenden Zeilen dann mit einer Warnung entfernen. Ordnen Sie den Faktor neu, wenn die Reihenfolge eine Eigenschaft der Daten ist, und verwenden Sie limits nur zum beabsichtigten Ausschließen.
Teilstriche einer kontinuierlichen Achse setzen und formatieren
Eine numerische Achse benötigt eine kontinuierliche Skala. Geben Sie die exakten Positionen mit breaks an und liefern Sie über labels entweder gleich viele Zeichenwerte oder eine Formatierungsfunktion. Eine Funktion ist bei veränderlichen Werten robuster, weil ggplot2 ihr die endgültigen Teilstrichwerte übergibt.
Dieses Streudiagramm setzt Teilstriche für die Motorleistung bei 100, 200 und 300 und hängt mit scales::label_number() die Einheit an. Der direkte Aufruf der Funktion prüft den Text vor dem Zeichnen.
hp_breaks <- c(100, 200, 300)
hp_formatter <- scales::label_number(suffix = " hp", accuracy = 1)
hp_formatter(hp_breaks)
continuous_plot <- ggplot(mtcars, aes(x = hp, y = mpg)) +
geom_point(size = 3, color = "#d95f0e") +
scale_x_continuous(
breaks = hp_breaks,
labels = hp_formatter
) +
labs(x = "Engine power", y = "Fuel economy (mpg)") +
theme_minimal(base_size = 16)
continuous_plot
ggsave(
"ggplot-continuous-axis-tick-labels.png",
plot = continuous_plot, width = 7.4, height = 4.82, dpi = 100, bg = "white"
)
[1] "100 hp" "200 hp" "300 hp"
Das Diagramm zeigt genau diese drei beschrifteten x-Positionen. Für eine numerische y-Achse verwenden Sie entsprechend scale_y_continuous(). Weitere Formatierungsfunktionen aus scales behandeln Tausendertrennzeichen, Prozentwerte oder Währungen. Die Daten bleiben dabei numerisch; nur der sichtbare Text ändert sich.
Exakte breaks sind sinnvoll, wenn die Positionen selbst eine Bedeutung haben. Wenn nur das Format wichtig ist, lassen Sie breaks weg, damit ggplot2 passende Positionen aus dem Wertebereich wählt, und setzen nur labels. Wandeln Sie die numerische Spalte nicht in Zeichenketten um, um eine Einheit anzuhängen: Dies ändert den Skalentyp und kann zu lexikografischer statt numerischer Anordnung führen.
Datumswerte bilden einen eigenen Skalentyp. Erbt die zugeordnete Spalte von Date, verwenden Sie scale_x_date() beziehungsweise die y-Variante, anstatt die Werte durch eine numerische oder diskrete Skala zu zwingen. Das Prinzip aus Positionen und Beschriftungen bleibt erhalten, nun mit datumsspezifischen Angaben.
Überlappende Teilstrichbeschriftungen drehen
Textinhalt und Textgestaltung lösen unterschiedliche Probleme. Wenn der Inhalt stimmt, aber Beschriftungen überlappen, behalten Sie die Skala bei und ändern axis.text.x im Theme. angle = 35 dreht den Text; hjust = 1 richtet dessen rechte Kante am Teilstrich aus. Die größere Grundschrift bleibt auch bei einem schmaleren Diagramm lesbar.
channel_sales <- data.frame(
channel = c(
"North America Online",
"Europe Retail Stores",
"Asia Pacific Partners",
"Latin America Direct"
),
orders = c(260, 220, 195, 150)
)
rotated_plot <- ggplot(channel_sales, aes(x = channel, y = orders)) +
geom_col(fill = "#31a354", width = 0.65) +
labs(x = "Sales channel", y = "Orders") +
theme_minimal(base_size = 18) +
theme(
axis.text.x = element_text(angle = 35, hjust = 1, vjust = 1)
)
rotated_plot
ggsave(
"ggplot-rotated-axis-tick-labels.png",
plot = rotated_plot, width = 7.4, height = 4.82, dpi = 100, bg = "white"
)
Die Drehung erhält alle vier Kategorienamen. Überlappen sie weiterhin, sind kürzere Bezeichnungen oder ein breiteres Diagramm meist verständlicher als ein noch steilerer Winkel. In der geprüften Umgebung mit ggplot2 3.3.5 verteilt scale_x_discrete(guide = guide_axis(n.dodge = 2)) diskrete Beschriftungen auf zwei Zeilen; die Funktion ist auch in der aktuellen API vorhanden. Diese Anordnung benötigt mehr vertikalen Platz. Weitere Möglichkeiten zeigt der Beitrag zum Drehen von Achsenbeschriftungen in Base R oder ggplot2.
Beschriftungen, Teilstriche oder Skalenpositionen gezielt ausblenden
Wählen Sie das Element, das tatsächlich verschwinden soll. Die drei Objekte zeigen unterschiedliche Auswirkungen:
control_plot <- base_plot +
theme_classic(base_size = 16)
labels_hidden <- control_plot +
theme(axis.text.x = element_blank())
ticks_hidden <- control_plot +
theme(axis.ticks.x = element_blank())
breaks_hidden <- control_plot +
scale_x_discrete(breaks = NULL)
control_plot verwendet theme_classic(), das kurze Teilstriche zeichnet und damit eine sichtbare Vergleichsbasis liefert. labels_hidden entfernt nur den gedruckten Text. ticks_hidden entfernt nur die kurzen Teilstriche; die Kategorienamen bleiben erhalten. breaks_hidden erzeugt keine Hauptpositionen auf der x-Skala, sodass zugehörige Beschriftungen und Teilstriche verschwinden. Keine Variante filtert Zeilen aus plan_sales.
Mit labels = NULL lassen sich Beschriftungen auf Skalenebene unterdrücken, während die Positionen erhalten bleiben. Das passt, wenn die Skala grundsätzlich keinen Text liefern soll. element_blank() eignet sich, wenn die Skala weiterhin bedeutungsvoll ist, aber ein bestimmtes Theme den Text nicht zeichnen soll. Ohne Beschriftungen sind Kategorien unter Umständen nicht mehr identifizierbar; ergänzen Sie dann direkte Anmerkungen oder eine andere Legende.
Für diese Varianten ist kein zusätzliches Bild nötig, weil Code und Ergebnisbeschreibung präziser vergleichbar sind. Geben Sie beispielsweise ticks_hidden in der R-Konsole aus und vergleichen Sie es mit control_plot. Balken und Höhen bleiben in allen drei Varianten unverändert; nur die Darstellung der Achse unterscheidet sich. Verändert sich die Geometrie oder erscheint eine Warnung über entfernte Zeilen, suchen Sie nach einem limits-Aufruf an anderer Stelle.
Falsche oder fehlende Teilstrichbeschriftungen beheben
Meldet ggplot2 einen kontinuierlichen Wert für eine diskrete Skala oder umgekehrt, prüfen Sie die Variable zuerst mit str(). Faktoren und Zeichenketten verwenden diskrete Skalen, Zahlen kontinuierliche Skalen und Date- beziehungsweise Datum-Zeit-Objekte ihre passenden Datumsskalen. Konvertieren Sie nur, wenn der neue Typ auch die Bedeutung der Werte korrekt ausdrückt.
Bei einem Zeichenvektor für labels sollten Sie explizite breaks angeben und beide Vektoren gleich lang halten. Sonst können Beschriftungen nach Filtern, Neuordnen oder Hinzufügen von Kategorien verrutschen. Benannte Zuordnungen wie plan_names zeigen, welcher Text zu welchem gespeicherten Wert gehört. Eine Funktion vermeidet das Längenproblem, wenn dieselbe Umwandlung für jeden Teilstrich gilt.
Fehlende Balken oder Warnungen über entfernte Zeilen weisen häufig auf limits statt auf labels hin. Prüfen Sie, ob ein vorhandener Datenwert in den Grenzen fehlt. Verwenden Sie breaks, wenn lediglich weniger Beschriftungen sichtbar sein sollen. Für Zoomen oder Bereichsgrenzen lesen Sie, wie Sie ggplot2-Achsengrenzen setzen, ohne sie mit Teilstrichen zu verwechseln.
Prüfen Sie schließlich, ob der geänderte Text wirklich eine Teilstrichbeschriftung ist. labs(x = "Plan") und das Argument name einer x-Skala setzen den Achsentitel. Das Argument labels steuert den Text an den Teilstrichen. Wer diese Rollen trennt, vermeidet den häufigen Fall, dass sich der Titel ändert, die Kategorien oder Zahlen aber unverändert bleiben.
Wählen Sie für die meisten Diagramme die Skala anhand des Datentyps, koppeln Sie breaks und labels, wenn der genaue Text wichtig ist, und verwenden Sie theme() nur für die Darstellung. So bleiben Achsenänderungen vorhersehbar und die zugrunde liegenden Beobachtungen erhalten.