Achsentext in Matplotlib drehen

Lesezeit: 4 Minuten

Benutzeravatar von tMC
tMC

Ich kann nicht herausfinden, wie ich den Text auf der X-Achse drehen kann. Es ist ein Zeitstempel, dh wenn die Anzahl der Samples zunimmt, kommen sie näher und näher, bis sie sich überlappen. Ich möchte den Text um 90 Grad drehen, damit sich die Muster nicht überlappen, wenn sie näher zusammenrücken.

Unten ist, was ich habe, es funktioniert gut, mit der Ausnahme, dass ich nicht herausfinden kann, wie man den Text der X-Achse dreht.

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')

Das funktioniert bei mir:

plt.xticks(rotation=90)

Benutzeravatar von getup8
aufstehen8

Viele “richtige” Antworten hier, aber ich werde noch eine hinzufügen, da ich denke, dass einige Details von mehreren weggelassen werden. Das OP hat nach einer 90-Grad-Drehung gefragt, aber ich werde auf 45 Grad wechseln, denn wenn Sie einen Winkel verwenden, der nicht null oder 90 ist, sollten Sie auch die horizontale Ausrichtung ändern. Andernfalls werden Ihre Beschriftungen außermittig und etwas irreführend sein (und ich vermute, dass viele Leute, die hierher kommen, die Achsen auf etwas anderes als 90 drehen möchten).

Einfachster / Geringster Code

Option 1

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

Wie bereits erwähnt, ist dies möglicherweise nicht wünschenswert, wenn Sie lieber den objektorientierten Ansatz wählen.

Option 2

Ein weiterer schneller Weg (es ist für Datumsobjekte gedacht, scheint aber auf jedem Etikett zu funktionieren; bezweifle jedoch, dass dies empfohlen wird):

fig.autofmt_xdate(rotation=45)

fig Sie würden normalerweise bekommen von:

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

Objektorientiert / Direkter Umgang mit ax

Möglichkeit 3a

Wenn Sie die Liste der Labels 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 verwenden set_xticks allein:

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

Möglichkeit 3b

Wenn Sie die Liste der Beschriftungen aus dem aktuellen Diagramm 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 können Sie in späteren Versionen von Matplotlib (3.5+) einfach verwenden set_xticks allein:

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

Möglichkeit 4

Ähnlich wie oben, aber stattdessen manuell durchschleifen.

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

Möglichkeit 5

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

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

Möglichkeit 6

Diese Option ist einfach, aber AFAIK können Sie die horizontale Ausrichtung des Etiketts nicht auf diese Weise festlegen, sodass eine andere Option möglicherweise besser ist, wenn Ihr Winkel nicht 90 beträgt.

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

Bearbeiten:
Es gibt Diskussionen über genau diesen “Bug”, aber ein Fix wurde nicht veröffentlicht (Stand 3.4.0):
https://github.com/matplotlib/matplotlib/issues/13774

Benutzeravatar von ryanjdillon
Ryanjdillon

Einfacher Weg

Als hier beschriebengibt es eine vorhandene Methode in der matplotlib.pyplot figure Klasse, die Daten automatisch entsprechend Ihrer Figur rotiert.

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

fig.autofmt_xdate()

Wenn Sie die Etiketten weiter formatieren müssen, sehen Sie sich den obigen Link an.

Nicht-datetime-Objekte

Gem languitar‘s Kommentar, die Methode, die ich für non-datetime vorgeschlagen habe xticks würde beim Zoomen etc. nicht richtig aktualisieren. Wenn es nicht a datetime Objekt, das als Ihre x-Achsendaten verwendet wird, sollten Sie folgen Tommys antwort:

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

Benutzeravatar von opiethehokie
opiethehokie

Versuchen Sie es mit pyplot.setp. Ich denke, du könntest so etwas tun:

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

Abgesehen von

plt.xticks(rotation=90)

das ist auch möglich:

plt.xticks(rotation='vertical')

Benutzeravatar von cjohnson318
cjohnson318

Mir ist ein ähnliches Beispiel eingefallen. Auch hier ist das Rotationsschlüsselwort … nun, es ist der Schlüssel.

from pylab import *
fig = figure()
ax = fig.add_subplot(111)
ax.bar( [0,1,2], [1,3,5] )
ax.set_xticks( [ 0.5, 1.5, 2.5 ] )
ax.set_xticklabels( ['tom','dick','harry'], rotation=45 ) ;

Benutzeravatar von kiril
Kiril

Wenn Sie eine Drehung auf das Achsenobjekt anwenden möchten, verwenden Sie am einfachsten tick_params. Zum Beispiel.

ax.tick_params(axis="x", labelrotation=90)

Matplotlib-Dokumentationsreferenz Hier.

Dies ist nützlich, wenn Sie ein Array von Achsen haben, das von zurückgegeben wird plt.subplotsund es ist bequemer als die Verwendung set_xticks denn in diesem Fall müssen Sie auch die Tick-Labels setzen, und auch bequemer als diejenigen, die über die Ticks iterieren (aus offensichtlichen Gründen)

1448980cookie-checkAchsentext in Matplotlib drehen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy