在 Python 中绘制动画箭袋
Posted
技术标签:
【中文标题】在 Python 中绘制动画箭袋【英文标题】:Plotting animated quivers in Python 【发布时间】:2013-10-20 04:15:07 【问题描述】:我正在尝试为 Python 中的风等矢量设置动画。我尝试在 pylab 中使用 quiver 函数,并与 matplotlib 中的 matplotlib.animation 结合使用。但是,结果显示'QuiverKey' object is not subscriptable
。我认为这是因为我对这两个功能不完全了解,或者这两个功能不匹配。下面是我的代码,它实际上是matplotlib中的quiver和animation函数的组合。
def update_line(num, data, line):
line.set_data(data[...,:num])
return line,
X,Y = np.meshgrid(np.arange(0,2*np.pi,.2),np.arange(0,2*np.pi,.2) )
U = np.cos(X)
V = np.sin(Y)
fig1 = plt.figure()
Q = quiver( X[::3, ::3], Y[::3, ::3], U[::3, ::3], V[::3, ::3],
pivot='mid', color='r', units='inches' )
data = quiverkey(Q, 0.5, 0.03, 1, r'$1 \fracms$', fontproperties='weight': 'bold')
plt.axis([-1, 7, -1, 7])
title('scales with plot width, not view')
l, = plt.plot([], [], 'r-')
plt.xlabel('x')
plt.ylabel('y')
plt.title('test')
line_ani = animation.FuncAnimation(fig1, update_line, 25, fargs=(data, l),
interval=50, blit=True)
plt.show()
【问题讨论】:
好吧,data
是一个 QuiverKey
对象 - 它代表一个箭袋图的键,而不是一个可以索引的值数组。我真的不明白你的目标是什么 - 你说你想绘制动画箭袋,但你的动画功能看起来只是为了给一条线添加点。你能描述一下你想要达到的目标吗?
嗨 ali_m,非常感谢您的评论和帮助。我的目标是创建一个动画,它会颤动到箭头的方向。可能是我对这个函数结构的理解太低了。你能帮我理解我是如何让每个箭袋向每个箭头(矢量)方向移动的吗?
我还是不太明白你的意思。你想改变箭头的长度和角度,还是想移动它们的枢轴点?据我所知,一旦创建了箭袋图,就无法更改其 x,y 坐标,但您可以使用 Q.set_UVC()
更新箭头向量。
谢谢 ali_m。 Q.set_UVC() 可能对我的目标有所帮助。我真的很感激。我会试试这个功能。
【参考方案1】:
下面是一个帮助您入门的示例:
import numpy as np
from matplotlib import pyplot as plt
from matplotlib import animation
X, Y = np.mgrid[:2*np.pi:10j,:2*np.pi:5j]
U = np.cos(X)
V = np.sin(Y)
fig, ax = plt.subplots(1,1)
Q = ax.quiver(X, Y, U, V, pivot='mid', color='r', units='inches')
ax.set_xlim(-1, 7)
ax.set_ylim(-1, 7)
def update_quiver(num, Q, X, Y):
"""updates the horizontal and vertical vector components by a
fixed increment on each frame
"""
U = np.cos(X + num*0.1)
V = np.sin(Y + num*0.1)
Q.set_UVC(U,V)
return Q,
# you need to set blit=False, or the first set of arrows never gets
# cleared on subsequent frames
anim = animation.FuncAnimation(fig, update_quiver, fargs=(Q, X, Y),
interval=50, blit=False)
fig.tight_layout()
plt.show()
【讨论】:
至少在 python 3.8 中,blit=True
可以正常工作。以上是关于在 Python 中绘制动画箭袋的主要内容,如果未能解决你的问题,请参考以下文章