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

9
这里可能有一点混淆:我想通过在预测时间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')

当然,这里的“datetime”指的是在Arrow函数中传递的变量t(或者在循环中的变量x)。

我想在同样的思路下,这是一个非常普遍的问题:如何将线条和其他注释放入一个坐标网格中,该网格的X轴和Y轴具有不同的单位?

1个回答

11

您可以使用matplotlib.dates (http://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


非常感谢你,朱利安!这正是我正在寻找的! - Balthasar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接