2012-06-12 64 views
92

No puedo entender cómo rotar el texto en el eje X. Es una marca de tiempo, por lo que a medida que aumenta el número de muestras, se acercan más y más hasta que se superponen. Me gustaría rotar el texto 90 grados para que las muestras se acerquen, no se superponen.Girar el texto del eje en matplotlib python

Debajo está lo que tengo, funciona bien con la excepción de que no puedo entender cómo rotar el texto del eje 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

Consulte [esta respuesta] (http://stackoverflow.com/a/14854007/2071807) para obtener información importante sobre cómo alinear las etiquetas giradas con 'ha' (alineación horizontal) – LondonRob

Respuesta

53

Pruebe pyplot.setp. Creo que podría hacer algo como esto:

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

' Traza (última llamada más reciente): Archivo " plotter.py ", línea 23, en plt.setp (tiempo, rotación = 90) Archivo" /usr/lib64/python2.7/site-packages/matplotlib/pyplot.py ", línea 183, en setp ret = _setp (* args, ** kwargs) Archivo "/usr/lib64/python2.7/site-packages/matplotlib/artist.py ", línea 1199, en setp func = getattr (o, funcName) AttributeError: el objeto 'datetime.datetime' no tiene ningún atributo 'set_rotation' ' – tMC

+0

Creo que he omitido un paso anterior. ¿El ejemplo editado es útil? Sin embargo, estoy muy lejos de ser un experto en matplotlib, podría haber una mejor manera. – opiethehokie

+1

Esto no parece funcionar en absoluto: la imagen (en mi máquina) se arruina completamente. Líneas negras en toda la imagen de salida ... Casi parece un código de barras. Es muy extraño. – tMC

31

Se me ocurrió un ejemplo similar. De nuevo, la palabra clave de rotación es ... bueno, es la clave.

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

Parece que funciona, pero muestra el tiempo como segundos desde la época, no la marca de tiempo de 'datetime' – tMC

99

Una forma sencilla de

Como described here, no es un método existente en la clase matplotlib.pyplotfigure que gira automáticamente fechas apropiadamente para que averiguar.

Se le puede llamar Después de trazar los datos (es decir, ax.plot(dates,ydata):.

fig.autofmt_xdate() 

Si es necesario formatear las etiquetas más, la comprobación del foro objetos

no datetime

Según languitar, el método que sugerí para no-fecha y hora xticks no se actualizaría correctamente cuando zoomi ng, etc. Si no es un objeto datetime usado como sus datos del eje x, debe seguir Tommy's answer:

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

Esta es la mejor forma porque es concisa, opera en tics existentes generados automáticamente y ajusta los márgenes de la trama para que es legible Otros métodos permiten que los ticks salgan de la página, requiriendo acciones adicionales (como plt.tight_layouts()) para ajustarlos. –

+0

En caso de que haya utilizado un localizador y formateador, el "otro" método podría romper su efecto si se aplica después. – languitar

+0

Finalmente, me estoy dando cuenta de esto. Gracias @ Alanguitar. – ryanjdillon

25

Mi respuesta es inspirada por la respuesta de cjohnson318, pero que no quería para suministrar una lista codificada de etiquetas; Quería girar las etiquetas existentes:

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

Esto parece no funcionar más. No hay ningún efecto en absoluto. – zbyszek

+5

Funciona según lo esperado para mí. –

115

Esto funciona para mí:

plt.xticks(rotation=90) 
+0

perfecto, gracias –

+2

esta debería ser la respuesta aceptada – Eddy

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

aparte de

plt.xticks(rotation=90) 

esto también es posible:

plt.xticks(rotation='vertical') 
Cuestiones relacionadas