如果一个轴包含时间,如何在matplotlib中绘制箭头?

时间:2015-04-21 14:46:47

标签: python matplotlib

这里有点混乱:我想通过在预测时间 t (在x轴上)以风速 wind 绘制一系列箭来绘制风预测( y轴)和箭头指向风吹来的方向。箭头的尺寸应该是绘图高度的给定分数,例如,任意确定为地块高度的1/15。由于地图自动缩放到 wind 列表中的最大风速,因此遵循:

arrowlength = np.max(wind) / 15.0

这应该以曲线Y单位产生箭头长度。问题似乎是X单位因绘图而不兼容,因为我使用了日期时间。因此,当我执行以下操作时,matplotlib会发生扭曲(如果 x轴不是日期时间,那么该代码应该可以正常工作):

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

这个坦克当然是日期时间 t (分别在循环中 x )传递给箭头功能。

我想的是同样的问题,那是一个非常普遍的问题:如何将线条和其他注释放入一个在X和Y中没有相同单位的坐标网格中?

1 个答案:

答案 0 :(得分:4)

您可以使用matplotlib.dateshttp://matplotlib.org/api/dates_api.html)使用date2num()方法将日期转换为轴坐标。在下面的示例中,我创建了一个箭头(2015年4月5日,10日)到(2015年4月7日,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