python - matrices - Marcadores de fecha y rotación en matplotlib
matplotlib xticks (4)
Otra forma de aplicar la horizontalalignment
y la rotation
a cada etiqueta tic es hacer un ciclo para las etiquetas que desea cambiar:
import numpy as np
import matplotlib.pyplot as plt
import datetime as dt
now = dt.datetime.now()
hours = [now + dt.timedelta(minutes=x) for x in np.arange(0,24*60,10)]
days = [now + dt.timedelta(days=x) for x in np.arange(0,30,1/4.)]
hours_value = np.random.random(len(hours))
days_value = np.random.random(len(days))
fig, axs = plt.subplots(2)
fig.subplots_adjust(hspace=0.75)
axs[0].plot(hours,hours_value)
axs[1].plot(days,days_value)
for label in axs[0].get_xmajorticklabels() + axs[1].get_xmajorticklabels():
label.set_rotation(30)
label.set_horizontalalignment("right")
Y aquí hay un ejemplo si desea controlar la ubicación de los tics mayores y menores:
import numpy as np
import matplotlib.pyplot as plt
import datetime as dt
fig, axs = plt.subplots(2)
fig.subplots_adjust(hspace=0.75)
now = dt.datetime.now()
hours = [now + dt.timedelta(minutes=x) for x in np.arange(0,24*60,10)]
days = [now + dt.timedelta(days=x) for x in np.arange(0,30,1/4.)]
axs[0].plot(hours,np.random.random(len(hours)))
x_major_lct = mpl.dates.AutoDateLocator(minticks=2,maxticks=10, interval_multiples=True)
x_minor_lct = matplotlib.dates.HourLocator(byhour = range(0,25,1))
x_fmt = matplotlib.dates.AutoDateFormatter(x_major_lct)
axs[0].xaxis.set_major_locator(x_major_lct)
axs[0].xaxis.set_minor_locator(x_minor_lct)
axs[0].xaxis.set_major_formatter(x_fmt)
axs[0].set_xlabel("minor ticks set to every hour, major ticks start with 00:00")
axs[1].plot(days,np.random.random(len(days)))
x_major_lct = mpl.dates.AutoDateLocator(minticks=2,maxticks=10, interval_multiples=True)
x_minor_lct = matplotlib.dates.DayLocator(bymonthday = range(0,32,1))
x_fmt = matplotlib.dates.AutoDateFormatter(x_major_lct)
axs[1].xaxis.set_major_locator(x_major_lct)
axs[1].xaxis.set_minor_locator(x_minor_lct)
axs[1].xaxis.set_major_formatter(x_fmt)
axs[1].set_xlabel("minor ticks set to every day, major ticks show first day of month")
for label in axs[0].get_xmajorticklabels() + axs[1].get_xmajorticklabels():
label.set_rotation(30)
label.set_horizontalalignment("right")
Tengo un problema al tratar de hacer rotar mis marcas de fecha en matplotlib. Un pequeño programa de muestra está debajo. Si trato de rotar los tics al final, los tics no se rotan. Si trato de rotar los ticks como se muestra debajo del comentario ''crashes'', entonces matplot lib falla.
Esto solo ocurre si los valores de x son fechas. Si reemplazo las dates
variables con la variable t
en la llamada a avail_plot
, la xticks(rotation=70)
funciona bien dentro de 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()
Si prefiere un enfoque no orientado a objetos, mueva plt.xticks (rotation = 70) a la derecha antes de las dos llamadas a avail_plot, por ejemplo
plt.xticks(rotation=70)
avail_plot(axs[0], dates, s1, ''testing'', ''green'')
avail_plot(axs[1], dates, s1, ''testing2'', ''red'')
Esto establece la propiedad de rotación antes de configurar las etiquetas. Dado que tiene dos ejes aquí, plt.xticks se confunde después de haber hecho las dos tramas. En el momento en que plt.xticks no hace nada, plt.gca () no le da los ejes que desea modificar, por lo que plt.xticks, que actúa sobre los ejes actuales, no funcionará.
Para un enfoque orientado a objetos que no use plt.xticks, puede usar
plt.setp( axs[1].xaxis.get_majorticklabels(), rotation=70 )
después de las dos llamadas a avail_plot. Esto establece la rotación en los ejes correctos específicamente.
Una solución fácil que evita el bucle sobre las ticklabes es simplemente usar
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 pueden cambiarse en la llamada de función
fig.autofmt_xdate(bottom=0.2, rotation=30, ha=''right'')
El argumento bottom
adicional es equivalente a establecer plt.subplots_adjust(bottom=bottom)
, que permite establecer el relleno de los ejes inferiores a un valor más grande para alojar las etiquetas rítmicas giradas.
Así que, básicamente, aquí tienes todos los ajustes que necesitas para tener un buen eje de fecha en un solo comando.
Un buen ejemplo se puede encontrar en la página matplotlib.
La solución funciona para matplotlib 2.1+
Existe un método de ejes tick_params
que puede cambiar las propiedades de tic. También existe como un método de eje como set_tick_params
ax.tick_params(axis=''x'', rotation=45)
O
ax.xaxis.set_tick_params(rotation=45)
Como nota al margen, la solución actual mezcla la interfaz con estado (usando pyplot) con la interfaz orientada a objetos utilizando el comando plt.xticks(rotation=70)
. Dado que el código en la pregunta utiliza el enfoque orientado a objetos, es mejor mantener ese enfoque en todo momento. La solución ofrece una buena solución explícita con plt.setp( axs[1].xaxis.get_majorticklabels(), rotation=70 )