Ручная установка xticks с помощью xaxis_date() в Python/matplotlib

Я искал, как построить графики зависимости от времени по оси x и в значительной степени отсортировать их, с одной странной причудой, которая заставляет меня задаться вопросом, не я столкнулся с ошибкой или (по общему признанию, гораздо более вероятным) делаю что-то, чего не совсем понимаю.

Проще говоря, ниже приведена упрощенная версия моей программы. Если я помещу это в файл .py и выполню от интерпретатора (ipython) я получаю цифру с осью x только с годом, «2012», повторяющимся несколько раз, вот так . ​​

Однако, если я закомментирую строку ( 40), который устанавливает xticks вручную, а именно «plt.xticks(tk)», а затем запускает именно эту команду в интерпретаторе сразу после выполнения скрипта, он отлично работает, и моя фигура выглядит так.

Точно так же это также работает, если я просто перемещаю эту строку после команды savefig в сценарии, то есть помещаю ее в самый конец файла. Конечно, в обоих случаях нужную ось будет иметь только нарисованная на экране фигура, а не сохраненный файл. Почему я не могу установить ось x раньше?

Благодарен за любую информацию, заранее спасибо!

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

5
задан bernie 11 March 2012 в 03:24
поделиться