Matplotlib函数动画未为预计算数据设置动画

2024-06-02 06:30:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用matplotlib在python中制作一些动画散点图。我目前有以下代码:

def calulateStep():

    # Math stuff ....
    # Changes values in in 'circpos' Nx2 array
   

fig, ax = plt.subplots(figsize=(5, 5))
ax.set(xlim=(-WELLRADIUS,WELLRADIUS), ylim=(-WELLRADIUS,WELLRADIUS))

[x,y] = np.hsplit(circpos,2)

scat = ax.scatter(x.flatten(),y.flatten())

def animate(i):
    calculateStep()
    scat.set_offsets(circpos)
    return scat,
    
anim = FuncAnimation(fig, animate, frames=60)

anim.save('test2.gif',writer='imagemagick')

plt.draw()
plt.show()

函数calculateStep为散射计算新的x、y值circpos包含每个步骤的数据数组。这很好地工作,并按预期生成散点图的动画gif。但是,该函数是一个相当缓慢的数值计算,需要许多步骤才能产生稳定的输出,因此我宁愿在计算之前计算所有,然后仅为选定帧设置动画。所以我试过这个

results = [circpos]

for h in range(61):
    
    calculateStep()
    results.append(circpos)
    
fig, ax = plt.subplots(figsize=(5, 5))
ax.set(xlim=(-WELLRADIUS,WELLRADIUS), ylim=(-WELLRADIUS,WELLRADIUS))

[x,y] = np.hsplit(results[0],2)

scat = ax.scatter(x.flatten(),y.flatten())


def animate(i):

    scat.set_offsets(results.pop(0))
    return scat,
    
anim = FuncAnimation(fig, animate, frames=60)

anim.save('test2.gif',writer='imagemagick')

plt.draw()
plt.show()

但是,使用此方法生成的gif仅包含动画的最后一帧。如果我从animate函数中打印数据,我会发现正确的数值会从结果列表中弹出,但出于某种原因,gif中只有最终值。我也尝试过使用results[i]而不是results.pop(0)。我无法理解这种行为


1条回答
网友
1楼 · 发布于 2024-06-02 06:30:07

看来我解决了自己的问题。当我将全局数组circpos的每次迭代添加到结果列表中时,它当然是一个浅拷贝。这意味着它只是对原始circpos数组的引用。因此,我最终得到了一个列表,其中充满了对同一对象的引用。打印出来的只是我误解了我所看到的。 现在,我将circpos.copy()添加到列表中,以在每一步获取数组的新副本。 在我意识到这一点之前,我已经在Python中绊倒了。还在学习

相关问题 更多 >