xticks matrices graficos grafico graficas graficar coordenadas barras python matplotlib

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

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