Girar el texto del eje en python matplotlib

No puedo imaginar 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 junten, no se superpongan.

A continuación se muestra lo que tengo, funciona bien con la excepción de que no puedo averiguar 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') 

Esto funciona para mí:

 plt.xticks(rotation=90) 

Forma fácil

Como se describe aquí , hay un método existente en la clase de figure matplotlib.pyplot que automáticamente gira las fechas de manera apropiada para su figura.

Puede llamarlo después de trazar sus datos (es decir, ax.plot(dates,ydata) :

 fig.autofmt_xdate() 

Si necesita formatear las tags aún más, revise el enlace anterior.

Objetos no datetime

Según el comentario de languitar , el método que sugerí para las xticks sin fecha no se actualizaría correctamente al hacer zoom, etc. Si no es un objeto de datetime y datetime utilizado como datos del eje x, debe seguir la respuesta de Tommy :

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

Pruebe pyplot.setp. Creo que podrías 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) 

Aparte de

 plt.xticks(rotation=90) 

esto también es posible:

 plt.xticks(rotation='vertical') 

Se me ocurrió un ejemplo similar. Una vez más, la palabra clave de rotación es … bueno, es 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 ) ; 

Mi respuesta está inspirada en la respuesta de cjohnson318, pero no quería proporcionar una lista de tags codificada; Quería rotar las tags existentes:

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

Si usa plt :

 plt.xticks(rotation=90) 

En caso de usar pandas o marinos para trazar, asumiendo ax como ejes para la ttwig:

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

Otra forma de hacer lo anterior:

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

Si desea aplicar rotación en el objeto de ejes, la forma más fácil es usar tick_params . Por ejemplo.

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

Matplotlib documentación de referencia aquí .

Esto es útil cuando tiene una matriz de ejes devueltos por plt.subplots , y es más conveniente que usar set_xticks porque en ese caso también necesita establecer las tags de tick, y también es más conveniente que aquellos que iteran sobre los ticks ( por obvias razones)

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

Dependerá de lo que estés ttwigndo.

 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) 

Para pandas y marinos que te dan un objeto Axes:

 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) 

Si necesita rotar las tags, es posible que también deba cambiar el tamaño de la fuente, puede usar font_scale=1.0 para hacerlo.