Установка xticks вручную с помощью xaxis_date () в Python / matplotlib - PullRequest
5 голосов
/ 11 марта 2012

Я изучал, как составить графики по времени на оси 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')

1 Ответ

5 голосов
/ 11 марта 2012

Не думаю, что вам нужен этот звонок на xaxis_date();поскольку вы уже предоставляете данные по оси X в формате, с которым matplotlib знает, как обращаться.Я также думаю, что с вашей формулой secs что-то не так.

Мы можем использовать встроенные средства форматирования и локаторы matplotlib для:

  1. установки основных xticks на регулярный интервал (минуты, часы, дни и т. Д.)
  2. настроить отображение с использованием строки форматирования strftime

Похоже, что если форматер не указан, по умолчанию отображается год;это то, что вы видели.

Попробуйте это:

import datetime as dt
import matplotlib.pyplot as plt
from matplotlib.dates import DateFormatter, MinuteLocator

x = [16.7,16.8,17.1,17.4]
y = [15,17,14,16]
e = [0.8,1.2,1.1,0.9]
xtn = []
for t in x:
  h = int(t)
  m = int((t-int(t))*60)
  xtn.append(dt.datetime.combine(dt.date(2012,1,1), dt.time(h,m)))

def larger_alim( alim ):
  ''' simple utility function to expand axis limits a bit '''
  amin,amax = alim
  arng = amax-amin
  nmin = amin - 0.1 * arng
  nmax = amax + 0.1 * arng
  return nmin,nmax

plt.errorbar(xtn,y,yerr=e,fmt='+',elinewidth=2,capsize=0,color='k',ecolor='k')
plt.gca().xaxis.set_major_locator( MinuteLocator(byminute=range(0,60,10)) )
plt.gca().xaxis.set_major_formatter( DateFormatter('%H:%M:%S') )
plt.gca().set_xlim( larger_alim( plt.gca().get_xlim() ) )
plt.show()

Результат:

enter image description here

ПОКАЗАТЬ функция полезности larger_alim изначально была написана для этого другого вопроса: Есть ли способ заставить matplotlib ослабить масштаб на нанесенных данных?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...