2015-04-21 2 views
3

Незначительная путаница здесь: хочу нарисовать прогноз ветра, рисуя серию стрелок в прогнозное время t (по оси x) при скорости ветра ветер (ось y) и стрелка, указывающая направление ветер дует. Размеры стрелки должны быть заданной долей высоты участка, например. произвольно определяется как 1/15 высоты участка. Поскольку сюжет автоматически масштабируются до максимальной скорости ветра на ветер списка , отсюда следует, что:Как нарисовать стрелку в matplotlib, если одна ось содержит время?

arrowlength = np.max(wind)/15.0 

Это должно дать длину стрелки в сюжетных Y единиц. Проблема заключается в том, что X-единицы, однако, несовместимы для целей рисования, потому что я использую для этого время datetime. Так Matplotlib получает свои панталоны в поворот, когда я делаю следующее (что код, который должен работать если ось х не было даты и времени):

for x,u,v,y in zip(t, windu, windv, wind): 
    xcomp = arrowlength * sin(u/v) 
    ycomp = arrowlength * cos(u/v) 
    arr = Arrow(x-xcomp/2, y-ycomp/2, x+xcomp/2, y+ycomp/2, edgecolor='black') 
    ax.add_patch(arr) 
arr.set_facecolor('b') 

Это танки, конечно, где DateTime t (x соответственно в цикле) передается функции Arrow.

Я полагаю, что многое в том же духе, это очень общий вопрос: как разместить строки и другие аннотации в сетке координат, которые не имеют одинаковых единиц в X и Y?

ответ

3

Вы можете использовать matplotlib.dates (http://matplotlib.org/api/dates_api.html), чтобы преобразовать координаты даты в оси, используя метод date2num(). В следующем примере я создаю стрелку происходит из (5 апреля 2015 года, 10) в (7 апреля 2015, 20):

import matplotlib.pyplot as plt 
import matplotlib.dates as md 

import datetime 

fig = plt.figure() 
ax = fig.add_subplot(111) 

t0 = datetime.datetime(2015,4,1) 
t = [t0+datetime.timedelta(days=j) for j in xrange(20)] 
y = range(20) 
ax.plot(t, y) 

x0 = md.date2num(datetime.datetime(2015,4,5)) 
y0 = 10 
xw = md.date2num(datetime.datetime(2015,4,7)) - x0 
yw = 10 
arr = plt.Arrow(x0, y0, xw, yw, edgecolor='black') 
ax.add_patch(arr) 
arr.set_facecolor('b') 
fig.autofmt_xdate() 
plt.show() 

enter image description here

+0

Благодаря очень Julien! Это именно то, что я искал! – Balthasar

+0

Добро пожаловать :-) –

Смежные вопросы