在 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 中绘制动画箭袋的主要内容,如果未能解决你的问题,请参考以下文章

麻烦在python中制作3D绘图的动画

Python随着时间的推移在Scatter3d中绘制动画标记样式或点

Python——项目-小游戏2-动画绘制

添加滑块以绘制热图动画-python

绘制动画网络图的工具是什么

『python』科学计算专项_科学绘图库matplotlib学习之绘制动画(待续)