Python中的分散动画

时间:2017-11-08 18:31:47

标签: python animation matplotlib

我试图在Python 3.6(在Spyder IDE中)动画散点图,其中有几个教程/示例(abc和许多其他),但是我的更新功能以某种方式接收了我认为我提供的一组非常不同的坐标。

以下是缩小的示例代码,其中4个点朝向中心。我绘制两次,首先是一行,第二次是动画。线条图看起来正确,但动画显示了非常不同的行为,包括点的位置和它们的轨迹。我推断我错误地向更新功能提供坐标信息,但我似乎无法确定原因/方式。

我可以提供数据显示应该发生什么情况,尽管为了简洁起见,我现在只提供这个示例代码。

import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
import matplotlib.animation as anim

npt=4
ntime=101
solx=np.zeros((npt,ntime))
soly=np.zeros((npt,ntime))
solx[0,0:]=np.linspace(0,40,ntime)
solx[1,0:]=solx[0,0:];
solx[2,0:]=100-solx[0,0:];
solx[3,0:]=solx[2,0:]
soly[0,0:]=np.linspace(0,80,ntime)
soly[1,0:]=200-soly[0,0:]
soly[2,0:]=soly[0,0:]
soly[3,0:]=soly[1,0:]


#%% Plots
colord=mpl.cm.gist_ncar(np.linspace(0,0.9,npt))
of2,oa2=plt.subplots(1)
for cnt in range(0,npt): oa2.plot(solx[cnt,0:],soly[cnt,0:],c=colord[cnt])

of3,oa3=plt.subplots()
osc3=oa3.scatter(solx[0:,0],soly[0:,0],c=colord,marker='+')
def aninit():
    osc3.set_offsets(np.stack((solx[0:,0],soly[0:,0]),axis=0))
    return osc3,
def aniupdate(i):
    osc3.set_offsets(np.stack((solx[0:,i],soly[0:,i]),axis=0))
    return osc3,

ani=anim.FuncAnimation(of3,aniupdate,init_func=aninit,frames=range(0,ntime),interval=100,blit=True,repeat=True,repeat_delay=1000)
plt.show()

1 个答案:

答案 0 :(得分:1)

如果您更换

np.stack((solx[0:,0],soly[0:,0]),axis=0)
np.stack((solx[0:,i],soly[0:,i]),axis=0)

使用:

list(zip(solx[0:,0],soly[0:,0]))
list(zip(solx[0:,i],soly[0:,i]))

或(如果你想使用numpy数组而不是列表:

np.array([solx[0:,0],soly[0:,0]]).T
np.array([solx[0:,i],soly[0:,i]]).T

aninit()aniupdate(i)函数中,行为应符合预期。

以下是我用来绘制图表的代码:

def aninit():
    offsetlist = np.array([solx[0:,0],soly[0:,0]]).T
    osc3.set_offsets(offsetlist)
    return osc3,

def aniupdate(i):
    offsetlist = np.array([solx[0:,i],soly[0:,i]]).T
    osc3.set_offsets(offsetlist)
    return osc3,