Tengo un problema al intentar rotar mis tics de fecha en matplotlib. Un pequeño programa de muestra está debajo. Si trato de rotar las garrapatas al final, las garrapatas no se rotan. Si intento rotar los ticks como se muestra debajo del comentario 'se bloquea', entonces matplot lib se bloquea.
Esto solo sucede si los valores de x son fechas. Si reemplazo la variable dates
con la variable t
en la llamada a avail_plot
, la xticks(rotation=70)
llamada funciona bien por dentro avail_plot
.
¿Algunas ideas?
import numpy as np
import matplotlib.pyplot as plt
import datetime as dt
def avail_plot(ax, x, y, label, lcolor):
ax.plot(x,y,'b')
ax.set_ylabel(label, rotation='horizontal', color=lcolor)
ax.get_yaxis().set_ticks([])
#crashes
#plt.xticks(rotation=70)
ax2 = ax.twinx()
ax2.plot(x, [1 for a in y], 'b')
ax2.get_yaxis().set_ticks([])
ax2.set_ylabel('testing')
f, axs = plt.subplots(2, sharex=True, sharey=True)
t = np.arange(0.01, 5, 1)
s1 = np.exp(t)
start = dt.datetime.now()
dates=[]
for val in t:
next_val = start + dt.timedelta(0,val)
dates.append(next_val)
start = next_val
avail_plot(axs[0], dates, s1, 'testing', 'green')
avail_plot(axs[1], dates, s1, 'testing2', 'red')
plt.subplots_adjust(hspace=0, bottom=0.3)
plt.yticks([0.5,],("",""))
#doesn't crash, but does not rotate the xticks
#plt.xticks(rotation=70)
plt.show()
python
matplotlib
Neal
fuente
fuente
Respuestas:
Si prefiere un enfoque no orientado a objetos, muévase
plt.xticks(rotation=70)
a la derecha antes de las dosavail_plot
llamadas, p. Ej.Esto establece la propiedad de rotación antes de configurar las etiquetas. Como tienes dos ejes aquí,
plt.xticks
se confunde después de haber hecho las dos parcelas. En el momento enplt.xticks
que no hace nada,plt.gca()
no le da los ejes que desea modificar yplt.xticks
, por lo tanto , lo que actúa sobre los ejes actuales no va a funcionar.Para un enfoque orientado a objetos que no use
plt.xticks
, puede usardespués de las dos
avail_plot
llamadas. Esto establece la rotación en los ejes correctos específicamente.fuente
plt.setp
, puede establecer múltiples parámetros al especificarlos como argumentos de palabras clave adicionales. elhorizontalalignment
kwarg es particularmente útil cuando gira las etiquetas de marca:plt.setp( axs[1].xaxis.get_majorticklabels(), rotation=70, horizontalalignment='right' )
ax.tick_params(axis='x', rotation=70)
en cualquier lugar.plt.setp
solución está completamente orientada a objetos. Si no le gusta el hecho de que haya algoplt
en él,from matplotlib.artist import setp; setp(ax.get_xticklabels(), rotation=90)
úselo.plt.xticks
que es pyplot. La documentación en sí dice no mezclar estilos.plt.setp
es más detallado pero tampoco el típico estilo orientado a objetos. Su respuesta es definitivamente la mejor aquí. Básicamente, cualquier cosa con una función no está orientada a objetos. No importa si importassetp
o no.yticks
, y el código no tiene un hacha definida en absoluto fuera deavail_plot
...La solución funciona para matplotlib 2.1+
Existe un método de ejes
tick_params
que puede cambiar las propiedades de la marca. También existe como un método de eje comoset_tick_params
O
Como nota al margen, la solución actual mezcla la interfaz con estado (usando pyplot) con la interfaz orientada a objetos mediante el comando
plt.xticks(rotation=70)
. Dado que el código en la pregunta usa el enfoque orientado a objetos, es mejor apegarse a ese enfoque en todo momento. La solución da una buena solución explícita conplt.setp( axs[1].xaxis.get_majorticklabels(), rotation=70 )
fuente
Una solución fácil que evita el bucle sobre los ticklabes es simplemente usar
fig.autofmt_xdate()
Este comando gira automáticamente las etiquetas xaxis y ajusta su posición. Los valores predeterminados son un ángulo de rotación de 30 ° y una alineación horizontal "derecha". Pero se pueden cambiar en la llamada de función
El
bottom
argumento adicional es equivalente a la configuraciónplt.subplots_adjust(bottom=bottom)
, lo que permite establecer el relleno de los ejes inferiores en un valor mayor para alojar las etiquetas rotatorias.Entonces, básicamente, aquí tiene todas las configuraciones que necesita para tener un eje de fecha agradable en un solo comando.
Un buen ejemplo se puede encontrar en la página matplotlib.
fuente
plt.setp
enfoque o recorrer los tics (que es esencialmente lo mismo).twinx
), arruina la alineación entre las marcas y las etiquetas de las marcas. En ese caso, la solución de Ted Petrou es mejor.Otra forma de aplicar
horizontalalignment
yrotation
para cada etiqueta de marca es hacer unfor
bucle sobre las etiquetas de marca que desea cambiar:Y aquí hay un ejemplo si desea controlar la ubicación de las garrapatas mayores y menores:
fuente
Simplemente use
fuente