Girar etiquetas de marca de eje
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 cada vez más hasta superponerse. Me gustaría rotar el texto 90 grados para que a medida que las muestras se acerquen, no se superpongan.
A continuación se muestra 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')
Esto funciona para mí:
plt.xticks(rotation=90)
Muchas respuestas "correctas" aquí pero agregaré una más ya que creo que de varias se omiten algunos detalles. El OP solicitó una rotación de 90 grados, pero cambiaré a 45 grados porque cuando usas un ángulo que no es cero ni 90, también debes cambiar la alineación horizontal; de lo contrario, sus etiquetas estarán descentradas y serán un poco engañosas (y supongo que muchas personas que vienen aquí quieren rotar los ejes a un valor distinto de 90).
Código más fácil/menor
Opción 1
plt.xticks(rotation=45, ha='right')
Como se mencionó anteriormente, esto puede no ser deseable si prefiere adoptar el enfoque orientado a objetos.
opcion 2
Otra forma rápida (está pensada para objetos de fecha, pero parece funcionar en cualquier etiqueta; aunque dudo que se recomiende):
fig.autofmt_xdate(rotation=45)
fig
normalmente obtendrías de:
fig = plt.gcf()
fig = plt.figure()
fig, ax = plt.subplots()
fig = ax.figure
Orientada a Objetos / Trato directo conax
Opción 3a
Si tienes la lista de etiquetas:
labels = ['One', 'Two', 'Three']
ax.set_xticks([1, 2, 3])
ax.set_xticklabels(labels, rotation=45, ha='right')
En versiones posteriores de Matplotlib (3.5+), puedes usar set_xticks
solo:
ax.set_xticks([1, 2, 3], labels, rotation=45, ha='right')
Opción 3b
Si desea obtener la lista de etiquetas del gráfico actual:
# 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')
Como se indicó anteriormente, en versiones posteriores de Matplotlib (3.5+), puedes usar set_xticks
solo:
ax.set_xticks(ax.get_xticks(), ax.get_xticklabels(), rotation=45, ha='right')
Opción 4
Similar al anterior, pero en su lugar realiza un bucle manual.
for label in ax.get_xticklabels():
label.set_rotation(45)
label.set_ha('right')
Opción 5
Todavía usamos pyplot
(as plt
) aquí pero está orientado a objetos porque estamos cambiando la propiedad de un ax
objeto específico.
plt.setp(ax.get_xticklabels(), rotation=45, ha='right')
Opción 6
Esta opción es simple, pero AFAIK no puede configurar la alineación horizontal de la etiqueta de esta manera, por lo que otra opción podría ser mejor si su ángulo no es 90.
ax.tick_params(axis='x', labelrotation=45)
Editar:
hay una discusión sobre este "error" exacto, pero no se ha publicado una solución (a partir de 3.4.0
):
https://github.com/matplotlib/matplotlib/issues/13774
Camino fácil
Como se describe aquí , existe un método en la matplotlib.pyplot
figure
clase que rota automáticamente 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 más las etiquetas, consulte el enlace anterior.
Objetos sin fecha y hora
Según el comentario de languitar , el método que sugerí para no fecha y hora xticks
no se actualizaría correctamente al hacer zoom, etc. Si no es un datetime
objeto utilizado como datos del eje x, debes seguir la respuesta de Tommy :
for tick in ax.get_xticklabels():
tick.set_rotation(45)