He estado buscando cómo hacer gráficas contra el tiempo en el eje x y tenerlo bastante ordenado, con una extraña peculiaridad que me hace preguntarme si he corrido en un error o (mucho más probable) estoy haciendo algo que realmente no entiendo.Configuración manual de xticks con xaxis_date() en Python/matplotlib
En pocas palabras, a continuación se muestra una versión simplificada de mi programa. Si pongo esto en un archivo .py y lo ejecuto desde un intérprete (ipython) obtengo una figura con un eje x con el año solamente, "2012", repetida varias veces, like this.
Sin embargo, si hago un comentario fuera de la línea (40) que establece los xticks manualmente, es decir 'plt.xticks (tk)' y luego ejecuto ese comando exacto en el intérprete inmediatamente después de ejecutar el script, funciona muy bien y la figura se ve like this.
De manera similar, también funciona si simplemente muevo esa línea para que esté después del comando savefig en el script, es decir para ponerlo al final del archivo. Por supuesto, en ambos casos, solo la figura dibujada en la pantalla tendrá el eje deseado, y no el archivo guardado. ¿Por qué no puedo establecer mi eje x antes?
Agradecido por cualquier información, gracias de antemano!
import matplotlib.pyplot as plt
import datetime
# define arrays for x, y and errors
x=[16.7,16.8,17.1,17.4]
y=[15,17,14,16]
e=[0.8,1.2,1.1,0.9]
xtn=[]
# convert x to datetime format
for t in x:
hours=int(t)
mins=int((t-int(t))*60)
secs=int(((t-hours)*60-mins)*60)
dt=datetime.datetime(2012,01,01,hours,mins,secs)
xtn.append(date2num(dt))
# set up plot
fig=plt.figure()
ax=fig.add_subplot(1,1,1)
# plot
ax.errorbar(xtn,y,yerr=e,fmt='+',elinewidth=2,capsize=0,color='k',ecolor='k')
# set x axis range
ax.xaxis_date()
t0=date2num(datetime.datetime(2012,01,01,16,35)) # x axis startpoint
t1=date2num(datetime.datetime(2012,01,01,17,35)) # x axis endpoint
plt.xlim(t0,t1)
# manually set xtick values
tk=[]
tk.append(date2num(datetime.datetime(2012,01,01,16,40)))
tk.append(date2num(datetime.datetime(2012,01,01,16,50)))
tk.append(date2num(datetime.datetime(2012,01,01,17,00)))
tk.append(date2num(datetime.datetime(2012,01,01,17,10)))
tk.append(date2num(datetime.datetime(2012,01,01,17,20)))
tk.append(date2num(datetime.datetime(2012,01,01,17,30)))
plt.xticks(tk)
plt.show()
# save to file
plt.savefig('savefile.png')