Girar etiquetas de marca de eje

Resuelto tMC asked hace 12 años • 0 respuestas

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')
tMC avatar Jun 12 '12 21:06 tMC
Aceptado

Esto funciona para mí:

plt.xticks(rotation=90)
scottlittle avatar Jun 08 '2016 16:06 scottlittle

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)

fignormalmente 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_xtickssolo:

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_xtickssolo:

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 axobjeto 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

getup8 avatar May 14 '2019 22:05 getup8

Camino fácil

Como se describe aquí , existe un método en la matplotlib.pyplot figureclase 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 xticksno se actualizaría correctamente al hacer zoom, etc. Si no es un datetimeobjeto utilizado como datos del eje x, debes seguir la respuesta de Tommy :

for tick in ax.get_xticklabels():
    tick.set_rotation(45)
ryanjdillon avatar Apr 11 '2014 10:04 ryanjdillon