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 datescon la variable ten 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_plotllamadas, p. Ej.Esto establece la propiedad de rotación antes de configurar las etiquetas. Como tienes dos ejes aquí,
plt.xticksse confunde después de haber hecho las dos parcelas. En el momento enplt.xticksque 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_plotllamadas. 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. elhorizontalalignmentkwarg 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.setpsolución está completamente orientada a objetos. Si no le gusta el hecho de que haya algoplten él,from matplotlib.artist import setp; setp(ax.get_xticklabels(), rotation=90)úselo.plt.xticksque es pyplot. La documentación en sí dice no mezclar estilos.plt.setpes 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 importassetpo 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_paramsque puede cambiar las propiedades de la marca. También existe como un método de eje comoset_tick_paramsO
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
bottomargumento 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.setpenfoque 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
horizontalalignmentyrotationpara cada etiqueta de marca es hacer unforbucle 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