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