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 que se superponen. Me gustaría rotar el texto 90 grados para que las muestras se acerquen y no se superpongan.
A continuación es 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')
python
matplotlib
tMC
fuente
fuente
ha
(alineación horizontal)Respuestas:
Esto funciona para mi:
fuente
ax.plot(...)
entoncesplt.xticks(rotation=90)
Manera fácil
Como se describe aquí , hay un método existente 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)
:Si necesita formatear más las etiquetas, consulte el enlace de arriba.
Objetos que no son de fecha y hora
Según el comentario de languitar , el método que sugerí para que no sea datetime
xticks
no se actualizaría correctamente al hacer zoom, etc. Si no se trata de undatetime
objeto utilizado como datos del eje x, debe seguir la respuesta de Tommy :fuente
Aquí hay muchas respuestas "correctas", pero agregaré una más ya que creo que algunos detalles quedan fuera de varios. El OP solicitó una rotación de 90 grados, pero cambiaré a 45 grados porque cuando usa un ángulo que no es cero o 90, también debe 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 algo que no sea 90).
Código más fácil / menos
Opción 1
Como se mencionó anteriormente, eso puede no ser deseable si prefiere adoptar el enfoque orientado a objetos.
opcion 2
Otra forma rápida (está destinado a objetos de fecha pero parece funcionar en cualquier etiqueta; sin embargo, dudo que esto se recomiende):
fig
normalmente obtendrías de:fig = plt.figure()
fig, ax = plt.subplots()
fig = ax.figure
Orientado a objetos / Tratar directamente con
ax
Opcion 3a
Si tiene la lista de etiquetas:
Opción 3b
Si desea obtener la lista de etiquetas del diagrama actual:
Opcion 4
Similar a lo anterior, pero en lugar de hacerlo manualmente.
Opción 5
Todavía usamos
pyplot
(comoplt
) aquí, pero está orientado a objetos porque estamos cambiando la propiedad de unax
objeto específico .Opcion 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.
Editar: Hay una discusión sobre este "error" exacto y una solución está potencialmente programada para
v3.2.0
: https://github.com/matplotlib/matplotlib/issues/13774fuente
Prueba pyplot.setp. Creo que podrías hacer algo como esto:
fuente
Traceback (most recent call last): File "plotter.py", line 23, in <module> plt.setp(time, rotation=90) File "/usr/lib64/python2.7/site-packages/matplotlib/pyplot.py", line 183, in setp ret = _setp(*args, **kwargs) File "/usr/lib64/python2.7/site-packages/matplotlib/artist.py", line 1199, in setp func = getattr(o, funcName) AttributeError: 'datetime.datetime' object has no attribute 'set_rotation'
setp(subplot(111).get_xticklabels(), rotation=90)
funciona bien con el backend Qt4Agg. En mi caso, se restableceplt.hist()
, así que lo llamo después, aunqueplt.plot()
no lo restablece, por lo que debería estar bien.locs, labels = plt.xticks() plt.setp(labels, rotation=90)
justo antesplt.plot(time, delay)
y funcionó bien.Aparte de
Esto también es posible:
fuente
plt.xticks(rotation=45) plt.savefig(nomefile,dpi=150, optimize=True) plt.clf()
Se me ocurrió un ejemplo similar. Nuevamente, la palabra clave de rotación es ... bueno, es clave.
fuente
datetime
Mi respuesta está inspirada en la respuesta de cjohnson318, pero no quería proporcionar una lista codificada de etiquetas; Quería rotar las etiquetas existentes:
fuente
Si usa
plt
:En caso de utilizar pandas o nacidos para trazar, asumiendo
ax
como ejes para la trama:Otra forma de hacer lo anterior:
fuente
for tick in ax.get_xticklabels(): tick.set_rotation(45)
hizo el truco para míSi desea aplicar rotación en el objeto de ejes, la forma más fácil es usarlo
tick_params
. Por ejemplo.Referencia de documentación de Matplotlib aquí .
Esto es útil cuando tiene una matriz de ejes como los devueltos
plt.subplots
, y es más conveniente que usarloset_xticks
porque en ese caso también necesita establecer las etiquetas de marca, y también más conveniente que las que iteran sobre las marcas (por razones obvias)fuente
pd_dataframe.plot().tick_params(axis='x', labelrotation=90)
.labelrotation=30
.fuente
Dependerá de lo que estés tramando.
Para los pandas y los nacidos en el mar que te dan un objeto Axes:
Si necesita rotar etiquetas, es posible que también necesite cambiar el tamaño de fuente, puede
font_scale=1.0
hacerlo.fuente
Para rotar la etiqueta del eje x a 90 grados
fuente
La solución más simple es usar:
pero también
Por ejemplo, para las fechas, utilicé la rotación = 45 y la parte inferior = 0.20, pero puede hacer alguna prueba para sus datos
fuente