607 Stimmen

Drehen Achse Text in Python matplotlib

Ich kann nicht herausfinden, wie ich den Text auf der X-Achse drehen kann. Es ist ein Zeitstempel, so wie die Anzahl der Proben zu erhöhen, erhalten sie näher und näher, bis sie überlappen. Ich möchte den Text um 90 Grad drehen, so wie die Proben näher zusammen bekommen, sie sind nicht überlappen.

Unten ist, was ich habe, es funktioniert gut mit der Ausnahme, dass ich nicht herausfinden kann, wie die X-Achse Text zu drehen.

import sys

import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
import datetime

font = {'family' : 'normal',
        'weight' : 'bold',
        'size'   : 8}

matplotlib.rc('font', **font)

values = open('stats.csv', 'r').readlines()

time = [datetime.datetime.fromtimestamp(float(i.split(',')[0].strip())) for i in values[1:]]
delay = [float(i.split(',')[1].strip()) for i in values[1:]]

plt.plot(time, delay)
plt.grid(b='on')

plt.savefig('test.png')

928voto

scottlittle Punkte 15865

Das funktioniert bei mir:

plt.xticks(rotation=90)

427voto

getup8 Punkte 5082

Es gibt hier viele "richtige" Antworten, aber ich füge noch eine hinzu, da ich denke, dass einige Details in einigen Fällen ausgelassen wurden. Der OP fragte nach einer 90-Grad-Drehung, aber ich ändere das in 45 Grad, denn wenn Sie einen Winkel verwenden, der nicht Null oder 90 ist, sollten Sie auch die horizontale Ausrichtung ändern; andernfalls werden Ihre Beschriftungen dezentriert und ein wenig irreführend sein (und ich vermute, dass viele Leute, die hierher kommen, Achsen auf etwas anderes als 90 drehen wollen).

Einfachster/geringster Code

Option 1

plt.xticks(rotation=45, ha='right')

Wie bereits erwähnt, ist das vielleicht nicht wünschenswert, wenn Sie lieber den objektorientierten Ansatz wählen.

Option 2

Ein anderer schneller Weg (er ist für Datumsobjekte gedacht, scheint aber bei jedem Etikett zu funktionieren; ich bezweifle allerdings, dass dies empfohlen wird):

fig.autofmt_xdate(rotation=45)

fig die Sie normalerweise bekommen würden:

  • fig = plt.gcf()
  • fig = plt.figure()
  • fig, ax = plt.subplots()
  • fig = ax.figure

Objektorientiert / Direkter Umgang mit ax

Option 3a

Wenn Sie die Liste der Etiketten haben:

labels = ['One', 'Two', 'Three']
ax.set_xticks([1, 2, 3])
ax.set_xticklabels(labels, rotation=45, ha='right')

In späteren Versionen von Matplotlib (3.5+) können Sie einfach set_xticks allein:

ax.set_xticks([1, 2, 3], labels, rotation=45, ha='right')

Option 3b

Wenn Sie die Liste der Beschriftungen des aktuellen Plots abrufen möchten:

# Unfortunately you need to draw your figure first to assign the labels,
# otherwise get_xticklabels() will return empty strings.
plt.draw()
ax.set_xticks(ax.get_xticks())
ax.set_xticklabels(ax.get_xticklabels(), rotation=45, ha='right')

Wie oben, in späteren Versionen von Matplotlib (3.5+), können Sie einfach verwenden set_xticks allein:

ax.set_xticks(ax.get_xticks(), ax.get_xticklabels(), rotation=45, ha='right')

Option 4

Ähnlich wie oben, aber stattdessen manuell durchlaufen.

for label in ax.get_xticklabels():
  label.set_rotation(45)
  label.set_ha('right')

Option 5

Wir verwenden immer noch pyplot (als plt ), aber es ist objektorientiert, weil wir die Eigenschaft eines bestimmten ax Objekt.

plt.setp(ax.get_xticklabels(), rotation=45, ha='right')

Option 6

Diese Option ist einfach, aber AFAIK können Sie nicht festlegen, Etikett horizontal ausrichten auf diese Weise so eine andere Option könnte besser sein, wenn Ihr Winkel ist nicht 90.

ax.tick_params(axis='x', labelrotation=45)

Bearbeiten: Es gibt Diskussionen über genau diesen "Fehler", aber eine Lösung wurde noch nicht veröffentlicht (Stand 3.4.0 ): https://github.com/matplotlib/matplotlib/issues/13774

214voto

ryanjdillon Punkte 15461

Einfacher Weg

Als hier beschrieben gibt es eine bestehende Methode in der matplotlib.pyplot figure Klasse, die automatisch die Daten für Ihre Figur entsprechend dreht.

Sie können es aufrufen, nachdem Sie Ihre Daten gezeichnet haben (d.h. ax.plot(dates,ydata) :

fig.autofmt_xdate()

Wenn Sie die Etiketten weiter formatieren müssen, besuchen Sie den obigen Link.

Nicht-datumsabhängige Objekte

Gemäß languitar Die von mir vorgeschlagene Methode für nicht-datumsabhängige xticks würde beim Zoomen usw. nicht korrekt aktualisiert. Wenn es sich nicht um eine datetime Objekt als Daten für die X-Achse zu verwenden, sollten Sie Folgendes tun Tommy Antwort :

for tick in ax.get_xticklabels():
    tick.set_rotation(45)

72voto

opiethehokie Punkte 1842

Versuchen Sie pyplot.setp. Ich denke, Sie könnten so etwas tun:

x = range(len(time))
plt.xticks(x,  time)
locs, labels = plt.xticks()
plt.setp(labels, rotation=90)
plt.plot(x, delay)

61voto

Matthew Punkte 706

Abgesehen von

plt.xticks(rotation=90)

ist dies ebenfalls möglich:

plt.xticks(rotation='vertical')

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X