it-swarm.com.de

Achsentext in python matplotlib drehen

Ich kann nicht herausfinden, wie ich den Text auf der X-Achse drehen soll. Es ist ein Zeitstempel, sodass die Anzahl der Abtastungen mit zunehmender Anzahl immer näher rückt, bis sie sich überlappen. Ich möchte den Text um 90 Grad drehen, damit sich die Beispiele nicht überlappen, wenn sie näher zusammenrücken.

Ich habe Folgendes: Es funktioniert einwandfrei, mit der Ausnahme, dass ich nicht herausfinden kann, wie der Text auf der X-Achse gedreht wird.

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

Das funktioniert bei mir:

plt.xticks(rotation=90)
376
scottlittle

Einfacher Weg

Als hier beschrieben gibt es eine vorhandene Methode in der matplotlib.pyplotfigure -Klasse, die Datumsangaben automatisch entsprechend Ihrer Figur dreht.

Sie können es aufrufen, nachdem Sie Ihre Daten geplottet haben (d. H. ax.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äß dem Kommentar languitar wird die von mir vorgeschlagene Methode für Nicht-Datumszeit xticks beim Zoomen usw. nicht korrekt aktualisiert. Wenn es sich nicht um ein datetime handelt Als X-Achsendaten verwendetes Objekt: Folgen Sie der Antwort von Tommy :

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

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)
62
opiethehokie

Appart von

plt.xticks(rotation=90)

das ist auch möglich:

plt.xticks(rotation='vertical')
44
Matthew

Ich habe mir ein ähnliches Beispiel ausgedacht. Das Schlüsselwort für die Rotation ist ... 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 ) ;
43
cjohnson318

Meine Antwort ist von der Antwort von cjohnson318 inspiriert, aber ich wollte keine fest codierte Liste von Labels bereitstellen. Ich wollte die vorhandenen Labels drehen:

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

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 über ein Achsenarray verfügen, das von plt.subplots zurückgegeben wird, und es ist praktischer als die Verwendung von set_xticks, da Sie in diesem Fall auch die Teilstrichbezeichnungen festlegen müssen und dies auch praktischer ist die über die Zecken iterieren (aus offensichtlichen Gründen)

20
kiril

Bei Verwendung von plt:

plt.xticks(rotation=90)

Wenn Sie pandas oder seaborn zum Plotten verwenden und ax als Achsen für das Plotten annehmen:

ax.set_xticklabels(ax.get_xticklabels(), rotation=90)

Eine andere Möglichkeit, das oben Genannte zu tun:

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

Viele "richtige" Antworten hier, aber ich werde noch eine hinzufügen, da ich denke, dass einige Details aus mehreren herausgelassen wurden. Das OP verlangte eine Drehung um 90 Grad, aber ich ändere die Einstellung auf 45 Grad. Wenn Sie einen Winkel ungleich Null oder 90 verwenden, sollten Sie auch die horizontale Ausrichtung ändern. Andernfalls sind Ihre Beschriftungen nicht zentriert und etwas irreführend (und ich vermute, dass viele Leute, die hierher kommen, Achsen um etwas anderes als 90 drehen möchten).

Einfachster/Wenigster Code

Option 1

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

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

Option 2

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

fig.autofmt_xdate(rotation=45)

fig, das Sie normalerweise erhalten würden von:

  • 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_xticklabels(labels, rotation=45, ha='right')

Option 3b

Wenn Sie die Liste der Beschriftungen aus dem aktuellen Plot erhalten 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_xticklabels(ax.get_xticklabels(), rotation=45, ha='right')

Option 4

Ähnlich wie oben, aber stattdessen manuell durchschleifen.

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

Option 5

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

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

Option 6

Diese Option ist einfach, aber AFAIK, Sie können die Beschriftung nicht auf diese Weise horizontal ausrichten, sodass eine andere Option möglicherweise besser ist, wenn Ihr Winkel nicht 90 beträgt.

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

Bearbeiten: Es wird über diesen genauen "Fehler" diskutiert, und ein Fix ist möglicherweise für v3.2.0: https: // github vorgesehen .com/matplotlib/matplotlib/issues/13774

14
getup8
import pylab as pl
pl.xticks(rotation = 90)
8
Ishan Tomar

Es wird davon abhängen, was Sie planen.

import matplotlib.pyplot as plt

 x=['long_text_for_a_label_a',
    'long_text_for_a_label_b',
    'long_text_for_a_label_c']
y=[1,2,3]
myplot = plt.plot(x,y)
for item in myplot.axes.get_xticklabels():
    item.set_rotation(90)

Für pandas und seaborn, die Ihnen ein Axes-Objekt geben:

df = pd.DataFrame(x,y)
#pandas
myplot = df.plot.bar()
#seaborn 
myplotsns =sns.barplot(y='0',  x=df.index, data=df)
# you can get xticklabels without .axes cause the object are already a 
# isntance of it
for item in myplot.get_xticklabels():
    item.set_rotation(90)

Wenn Sie Etiketten drehen müssen, müssen Sie möglicherweise auch die Schriftgröße ändern. Verwenden Sie dazu font_scale=1.0.

3
Isac Junior

So drehen Sie die Beschriftung der x-Achse in ax.get_xticklabels () um 90 Grad, um das Häkchen zu setzen: tick.set_rotation (45)

0
Mudit