2012-06-12 18 views
92

Non riesco a capire come ruotare il testo sull'asse X. È un indicatore orario, così come il numero di campioni aumenta, si avvicinano sempre di più fino a sovrapporsi. Mi piacerebbe ruotare il testo di 90 gradi in modo che i campioni si avvicinino, non si sovrappongano.Ruota il testo dell'asse in python matplotlib

Di seguito è quello che ho, funziona perfettamente con l'eccezione che non riesco a capire come ruotare il testo dell'asse X.

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

Vedere [questa risposta] (http://stackoverflow.com/a/14854007/2071807) per informazioni importanti sull'allineamento delle etichette ruotate con 'ha' (allineamento orizzontale) – LondonRob

risposta

53

Provare pyplot.setp. Penso che potresti fare qualcosa del genere:

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

' Traceback (ultima chiamata ultima): File " plotter.py ", riga 23, in plt.setp (tempo, rotazione = 90) File" /usr/lib64/python2.7/site-packages/matplotlib/pyplot.py ", riga 183, in setp ret = _setp (* args, ** kwargs) File "/usr/lib64/python2.7/site-packages/matplotlib/artist.py ", riga 1199, in setp func = getattr (o, funcName) AttributeError: l'oggetto 'datetime.datetime' non ha attributo 'set_rotation' ' – tMC

+0

Penso di aver saltato un passaggio prima. L'esempio modificato aiuta? Comunque, lungi dall'essere un esperto di matplotlib, potrebbe esserci un modo migliore: – opiethehokie

+1

Questo non sembra funzionare affatto- L'immagine (sulla mia macchina) si incasina completamente ... linee nere su tutta l'immagine in uscita ... Quasi è un codice a barre molto strano – tMC

31

Mi è venuto in mente un esempio simile. Ancora una volta, la parola chiave di rotazione è ... beh, è ​​la chiave.

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) ; 
+0

Sembra che funzioni, ma mostra il tempo in secondi da epoch- non il timestamp da 'datetime' – tMC

99

Modo semplice

Come described here, v'è un metodo esistente nella classe matplotlib.pyplotfigure che ruota automaticamente le date in modo appropriato per voi capire.

Si può chiamare dopo a tracciare i dati (cioè ax.plot(dates,ydata):.

fig.autofmt_xdate() 

Se è necessario formattare le etichette ulteriormente, checkout il link qui sopra oggetti

non datetime

Secondo il commento di languitar, il metodo che ho suggerito per non-datetime xticks non si aggiornava correttamente quando zoomi ng, ecc Se non è un oggetto datetime usato come i dati dell'asse X, si dovrebbe seguire Tommy's answer:

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

Questo è il modo migliore perché è conciso, opera su tick esistenti generati automaticamente e regola i margini della trama in modo che è leggibile Altri metodi consentono alle zecche di uscire dalla pagina, richiedendo ulteriori azioni (come ad esempio plt.tight_layouts()) per regolarle. –

+0

Nel caso in cui si sia utilizzato un localizzatore e un formattatore, il "altro" metodo potrebbe interrompere il loro effetto se applicato successivamente. – languitar

+0

Finalmente arrivando a questo. Grazie a @languitar. – ryanjdillon

25

La mia risposta si ispira la risposta di cjohnson318, ma non ho voluto fornire un elenco hardcoded dei etichette; Volevo ruotare le etichette esistenti:

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

Questo non sembra funzionare più. Non c'è alcun effetto. – zbyszek

+5

Funziona come previsto per me. –

115

questo funziona per me:

plt.xticks(rotation=90) 
+0

perfetto, grazie –

+2

questa dovrebbe essere la risposta accettata – Eddy

7
import pylab as pl 
pl.xticks(rotation = 90) 
26

Appart da

plt.xticks(rotation=90) 

anche questo è possibile:

plt.xticks(rotation='vertical') 
Problemi correlati