Python 在matplotlib中设置任何艺术家动画的一般方法?

Python 在matplotlib中设置任何艺术家动画的一般方法?,python,matplotlib,animation,Python,Matplotlib,Animation,最近我在matplotlib中尝试了两个不同的艺术家plt.quiver()和plt.hist(),两次我都遇到了同样的问题。显然,这些类(我希望我的OOP素养能保持下去)都没有类似于set\u data的方法。从技术上讲,plt.quiver()确实有set\u UVC,但这不适用于Line3D实例,仅适用于Line2D。此外,还有一个例子,但它似乎是一些严重的偷工减料操纵我。我尝试在update()函数中使用新值简单地定义我的艺术家,然后返回新的艺术家,而不是在update()之外定义艺术家

最近我在matplotlib中尝试了两个不同的艺术家
plt.quiver()
plt.hist()
,两次我都遇到了同样的问题。显然,这些类(我希望我的OOP素养能保持下去)都没有类似于
set\u data
的方法。从技术上讲,
plt.quiver()
确实有
set\u UVC
,但这不适用于
Line3D
实例,仅适用于
Line2D
。此外,还有一个例子,但它似乎是一些严重的偷工减料操纵我。我尝试在
update()
函数中使用新值简单地定义我的艺术家,然后返回新的艺术家,而不是在
update()
之外定义艺术家,然后使用
set\u data()
方法更新艺术家的数据。但这只会导致所有帧都保留在绘图中并重叠的动画。下面是直方图和箭图的动画

直方图:

将numpy导入为np
将matplotlib.pyplot作为plt导入
从matplotlib.animation导入FuncAnimation
"""
1000个骰子卷产生的平均值的演变
越来越多的骰子,这导致方差缩小
随着骰子数量的增加。
"""
图,ax=plt.子批次()
def更新(一):
k=[np.平均值(np.随机.randint(0,7,i)),范围为(1000)]
lol=ax.hist(k,bin=20)
返回lol
ani=FuncAnimation(图,更新,帧=(1,2,101001000))
plt.show()
箭袋:

来自mpl_toolkits.mplot3d导入axes3d
将matplotlib.pyplot作为plt导入
将numpy作为np导入
从matplotlib.animation导入FuncAnimation
def旋转z(角度):
o=2*np.pi*(角度/360)
mat=np.数组((np.cos(o),-np.sin(o),0),
(np.sin(o),np.cos(o),0),
(    0    ,     0    ,0)))
回程垫
图=plt.图()
ax=图gca(投影=3d')
ax.set_xlim(-1.5,1.5)
ax.set_ylim(-1.5,1.5)
ax.集_zlim(-1.5,1.5)
def更新(帧):
x、 y,z=rot_z(frame).dot(np.array((1,1,1)))
箭袋=最大箭袋(0,
0, 
0, 
x,,
Y
Z
长度=1)
回程箭
ani=FuncAnimation(图,更新,帧=np.linspace(0360100))
plt.show()

如果运行它们,您可以看到问题。所以我想知道:是不是有一种更简单、更抽象的方式来给艺术家们制作动画,还是我会受到潜在的不存在的设定者的摆布?我检查了
dir(plt.quiver)和dir(plt.hist)
,看看我是否忽略了文档中的这些方法,但动画直方图的示例似乎证实了我的担心。

你可以尝试在每次更新时用
ax.clear()
清除图像。如果您扩展一个抛出数组,而不是在每一帧从头开始,直方图动画可能会更平滑

编辑:下面的代码包括一个重用相同样本的测试

将numpy导入为np
将matplotlib.pyplot作为plt导入
从matplotlib.animation导入FuncAnimation
图,ax=plt.子批次()
randnums=[np.random.randint(0,71000)表示范围(1000)内的j]
def更新(一):
k=范围(1000)内j的[np.平均值(randnums[j][:i])]
ax.clear()
lol=ax.hist(k,bin=20)
返回lol
ani=FuncAnimation(图,更新,帧=[2**t代表范围(11)])
plt.show()

是的,我现在并不需要高性能,所以这是可行的,但我知道使用setter是实现更好性能的关键。扩展数组?我不是真的要你去那里。这些抛出应该是相互独立的。哦,所以你只是事先做了一个值的加载,然后对它们进行切片。是的,这很有意义,非常感谢。请参阅关于更新GraceScRebug的更新箭头向量。这个答案是有用的,你可以考虑投票。