HOWTO · Matplotlib

Wie Sie den Text der Tickbeschriftungen der X-Achse in Matplotlib drehen

Lernen Sie fünf Möglichkeiten kennen, die Tickbeschriftungen der x-Achse in Matplotlib zu drehen und auszurichten, wenn lange Beschriftungen einander überlagern.

Auf dieser Seite

Um die Beschriftungen der x-Achsen-Ticks in Matplotlib zu drehen, übergeben Sie einen Winkel wie rotation=45 an plt.xticks, fig.autofmt_xdate, ax.set_xticklabels, plt.setp oder ax.tick_params. 45 Grad sind ein guter Ausgangspunkt, wenn sich lange horizontale Beschriftungen überlagern. Richten Sie die gedrehten Beschriftungen mit ha="right" aus, damit ihre Enden nahe an den zugehörigen Ticks liegen. Die folgenden Beispiele zeigen, wann sich die einzelnen APIs eignen.

Ohne Drehung stehen Kategoriebezeichnungen wie Monatsnamen horizontal und füllen die gesamte Achsenbreite aus, sodass längere Namen oder eine schmalere Figur benachbarte Beschriftungen ineinanderlaufen lassen:

Liniendiagramm der Monatswerte mit horizontalen Tickbeschriftungen January, February, March und April, die die gesamte Achsenbreite ausfüllen.

x-Achsen-Tickbeschriftungen mit plt.xticks drehen

plt.xticks ist eine kompakte Möglichkeit, mit pyplot zu arbeiten. Das Schlüsselwort rotation legt den Winkel in Grad fest; standardmäßig sind die Beschriftungen horizontal. Dieses Beispiel stellt Kategorien dar und dreht ihre Beschriftungen um 45 Grad.

import matplotlib.pyplot as plt

months = ["January", "February", "March", "April"]
values = [12, 18, 15, 22]

fig, ax = plt.subplots()
ax.plot(months, values, marker="o")
plt.xticks(rotation=45, ha="right")
ax.grid(True)
fig.tight_layout()

Dasselbe Liniendiagramm der Monatswerte mit um 45 Grad gedrehten, rechtsbündigen Tickbeschriftungen, sodass jede Beschriftung an ihrem Tick endet.

Verwenden Sie plt.xticks für eine schnelle Änderung an den aktuellen Achsen. Wenn Ihr Code bereits ein Axes-Objekt verwendet, sprechen die entsprechenden Methoden weiter unten die gewünschte Achse ausdrücklich an.

Datumsachsen-Beschriftungen mit fig.autofmt_xdate drehen

Bei Diagrammen mit Datumswerten formatiert fig.autofmt_xdate die Datumsbeschriftungen der Abbildung und dreht sie, damit sie besser lesbar sind. Die Standardeinstellungen passen außerdem die Ausrichtung und den unteren Rand an. Wenn Sie einen bestimmten Winkel wünschen, können Sie rotation ausdrücklich festlegen. Das Verhalten hängt von den Achsen der Abbildung und dem Datumsformat ab. Verwenden Sie die Methode daher für Datumsachsen und nicht als allgemeinen Ersatz für jede Einstellung von Tick-Beschriftungen.

import matplotlib.pyplot as plt
from datetime import date, timedelta

start = date(2024, 1, 1)
dates = [start + timedelta(days=7 * i) for i in range(6)]
values = [3, 5, 4, 7, 6, 9]

fig, ax = plt.subplots()
ax.plot(dates, values, marker="o")
fig.autofmt_xdate(rotation=45)
ax.grid(True)

Liniendiagramm über sechs wöchentliche Daten im Januar und Februar 2024 mit durch autofmt_xdate um 45 Grad gedrehten Datumsbeschriftungen.

Das ist praktisch, wenn die x-Achse Datumswerte verwendet und die formatierten Beschriftungen gedreht sowie mit genügend Abstand angezeigt werden sollen. Für gewöhnliche Kategorien wählen Sie eine der Tick-Beschriftungsmethoden aus den anderen Abschnitten.

Beschriftungen und Drehung mit ax.set_xticklabels festlegen

Verwenden Sie ax.set_xticklabels, wenn Sie neben der Drehung auch eigene Beschriftungstexte angeben möchten. Legen Sie zuerst die Tick-Positionen ausdrücklich fest und geben Sie für jede Position genau eine Beschriftung an, damit jeder Text dem vorgesehenen Tick zugeordnet bleibt. Für eine reine Drehung müssen Sie die Beschriftungen nicht ersetzen; verwenden Sie tick_params oder plt.setp, wenn der vorhandene Text erhalten bleiben soll.

import matplotlib.pyplot as plt

positions = [0, 1, 2, 3]
labels = ["North region", "South region", "East region", "West region"]
values = [8, 5, 9, 6]

fig, ax = plt.subplots()
ax.plot(positions, values, marker="o")
ax.set_xticks(positions)
ax.set_xticklabels(labels, rotation=45, ha="right")
ax.grid(True)
fig.tight_layout()

Liniendiagramm mit benutzerdefinierten Achsenbeschriftungen North region, South region, East region und West region, um 45 Grad gedreht und rechtsbündig ausgerichtet.

Behalten Sie für Positionen und Beschriftungen dieselbe Reihenfolge bei. Wenn sich die Ticks des Diagramms später ändern, passen Sie die eigenen Beschriftungen entsprechend an.

Eigenschaften von Beschriftungen mit plt.setp festlegen

plt.setp ändert Eigenschaften vorhandener Matplotlib-Artists, darunter die aktuellen Objekte der x-Achsen-Tick-Beschriftungen, die ax.get_xticklabels() zurückgibt. Die Methode eignet sich, wenn die Beschriftungen bereits vorhanden sind und Sie nur ihr Aussehen ändern möchten.

import matplotlib.pyplot as plt

categories = ["First quarter", "Second quarter", "Third quarter", "Fourth quarter"]
values = [14, 17, 13, 21]

fig, ax = plt.subplots()
ax.plot(categories, values, marker="o")
plt.setp(ax.get_xticklabels(), rotation=45, ha="right")
ax.grid(True)
fig.tight_layout()

Liniendiagramm der Quartalswerte mit den per plt.setp um 45 Grad gedrehten und rechtsbündig ausgerichteten Tickbeschriftungen.

Hier ändert rotation den Winkel und ha legt die horizontale Ausrichtung fest. Dadurch werden die aktuellen Tick-Beschriftungsobjekte angepasst, ohne ihren Text zu ersetzen.

Drehung der x-Achsen-Beschriftungen mit ax.tick_params festlegen

ax.tick_params legt Eigenschaften von Ticks, Tick-Beschriftungen und Gitternetzlinien für eine ausgewählte Achse fest. Übergeben Sie axis="x" und das kleingeschriebene Schlüsselwort labelrotation, um die Beschriftungen der x-Achse zu drehen und dabei Text und Positionen beizubehalten.

import matplotlib.pyplot as plt

categories = ["Planning", "Development", "Review", "Delivery"]
values = [2, 5, 3, 6]

fig, ax = plt.subplots()
ax.plot(categories, values, marker="o")
ax.tick_params(axis="x", labelrotation=45)
ax.grid(True)
fig.tight_layout()

Liniendiagramm von vier Projektphasen mit den über das Schlüsselwort labelrotation von tick_params um 45 Grad gedrehten Tickbeschriftungen.

Verwenden Sie diese achsenbezogene Form, wenn Sie bereits eine Axes-Referenz haben. Das Schlüsselwort wird vollständig kleingeschrieben: labelrotation.

Gedrehte Tickbeschriftungen ausrichten

Die Drehung ändert den Winkel. Die horizontale Ausrichtung bestimmt, welcher Teil der Beschriftung auf dem zugehörigen Tick liegt. Bei ha="right" trifft das rechte Ende der Beschriftung auf den Tick, bei ha="left" das linke Ende und bei ha="center" ihre Mitte. Bei um 45 Grad gedrehten Beschriftungen, die sich von ihren Ticks nach links erstrecken, ist die Rechtsausrichtung eine gängige Wahl. Probieren Sie die Optionen mit Ihren Beschriftungslängen und dem Layout des Diagramms aus.

import matplotlib.pyplot as plt

positions = [0, 1, 2, 3]
labels = ["January", "February", "March", "April"]
values = [4, 7, 5, 8]
alignments = ["right", "left", "center"]

fig, axes = plt.subplots(1, 3, figsize=(10, 3))
for ax, alignment in zip(axes, alignments):
    ax.plot(positions, values, marker="o")
    ax.set_xticks(positions)
    ax.set_xticklabels(labels, rotation=45, ha=alignment)
    ax.set_title(f'ha="{alignment}"')
    ax.grid(True)
fig.tight_layout()

Drei nebeneinanderstehende Liniendiagramme, die 45-Grad-Tickbeschriftungen mit horizontaler Ausrichtung right, left und center vergleichen.

Wählen Sie die Ausrichtung danach, wo die jeweilige Beschriftung verankert sein soll. Wenn die Beschriftungen weiterhin gedrängt wirken, können Sie zusätzlich zur Drehung die Abbildungsbreite oder den Wortlaut der Beschriftungen anpassen.

Abgeschnittene Beschriftungen und Fehler bei der Beschriftungsanzahl beheben

Zwei Fehler bleiben auch dann möglich, wenn die Drehung selbst funktioniert. Erstens ersetzt ax.set_xticklabels den Beschriftungstext, daher muss die Anzahl der Beschriftungen mit der Anzahl der Tickpositionen übereinstimmen. Werden drei Beschriftungen für vier Positionen übergeben, schlägt der Aufruf fehl, bevor etwas gezeichnet wird:

import matplotlib.pyplot as plt

positions = [0, 1, 2, 3]
labels = ["North", "South", "East"]
values = [8, 5, 9, 6]

fig, ax = plt.subplots()
ax.plot(positions, values, marker="o")
ax.set_xticks(positions)
ax.set_xticklabels(labels, rotation=45, ha="right")

Der Aufruf endet mit diesem Fehler:

ValueError: The number of FixedLocator locations (4), usually from a call to set_ticks, does not match the number of labels (3).

Ergänzen Sie die fehlende Beschriftung, sodass beide Sequenzen in derselben Reihenfolge gleich lang sind. Wenn Sie nur den vorhandenen Text drehen müssen, ziehen Sie stattdessen plt.setp oder ax.tick_params vor: Sie behalten die aktuellen Beschriftungen bei, sodass diese Nichtübereinstimmung nicht auftreten kann.

Zweitens ändert die Drehung zwar den Winkel, schafft aber keinen Platz unterhalb der Achse. Rendern Sie das set_xticklabels-Beispiel oben ohne seinen Aufruf von fig.tight_layout(), und die gedrehten Beschriftungen ragen über den unteren Figurenrand hinaus — in einer Darstellung in Standardgröße stehen sie etwa 31 Pixel über den Rand hinaus und werden mitten im Text abgeschnitten:

Liniendiagramm mit 45-Grad-Regionsbeschriftungen, die am unteren Figurenrand abgeschnitten sind, weil tight_layout nicht angewendet wurde.

fig.tight_layout() berechnet den Figurenrahmen neu, sodass jede Beschriftung Platz findet; auf dieselbe Weise gemessen, enden die Beschriftungen dann genau am Figurenrand, ohne dass etwas außerhalb liegt. fig.autofmt_xdate nimmt für Datumsachsen eine entsprechende Randanpassung vor. Wenn Beschriftungen nach der Layoutanpassung immer noch kollidieren, kürzen Sie den Beschriftungstext oder verbreitern Sie die Figur, statt den Winkel zu vergrößern.