Python中的散点动画

Python中的散点动画,python,animation,matplotlib,Python,Animation,Matplotlib,我试图在Python3.6(Spyder IDE)中制作散点图的动画,其中有几个教程/示例(、、和许多其他示例),但是我的更新函数不知何故接收到的坐标集与我认为提供的坐标集非常不同 下面是一个简化的示例代码,其中4个点朝向中心。我画了两次,第一次是线,第二次是动画。线条图看起来不错,但动画显示了非常不同的行为,无论是在点的位置还是它们的轨迹方面。我推断我错误地向更新函数提供坐标信息,但我似乎无法确定原因/方式 虽然为了简洁起见,我现在只提供这个示例代码,但我可以提供一些数字来显示发生了什么vs.

我试图在Python3.6(Spyder IDE)中制作散点图的动画,其中有几个教程/示例(、、和许多其他示例),但是我的更新函数不知何故接收到的坐标集与我认为提供的坐标集非常不同

下面是一个简化的示例代码,其中4个点朝向中心。我画了两次,第一次是线,第二次是动画。线条图看起来不错,但动画显示了非常不同的行为,无论是在点的位置还是它们的轨迹方面。我推断我错误地向更新函数提供坐标信息,但我似乎无法确定原因/方式

虽然为了简洁起见,我现在只提供这个示例代码,但我可以提供一些数字来显示发生了什么vs.应该发生什么

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()
如果你更换

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

或者(如果要使用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,

您好,TTT,如果您能以MWE(最小工作示例)的形式提供代码,这会有所帮助。我无法按原样运行您提供的代码来重现您的错误。此外,这可能与您使用的python版本有关(2.7 vs 3.x)。@DominiqueFuchs抱歉,我已经对其进行了测试,但显然没有成功重置我的工作区(Spyder很棘手)。代码修复(我希望如此)。复制粘贴您的代码时出现以下错误:返回数组(a,dtype,Copy=False,order=order,subok=True)TypeError:float()参数必须是字符串或数字,而不是“zip”。不过,您指出我的代码中的错误是对的。修复它不会改变行为,但我会在我的问题中修复它。我的错误,没有检查您正在使用的Python版本。
zip()
被重新定义为返回迭代器而不是返回列表。我已将解决方案更改为使用python 3.6 you's my hero。我尝试了几种不同的语法变体,以找到一些可能无法成功运行的内容。您能告诉我在哪里可以找到有关
设置偏移
请求的数据格式的文档吗可能会就此提出一个单独的问题,因为我自己还没有找到答案。从您的代码中,我发现坐标解析不正确(因为点在移动,但沿着错误的坐标)。压缩坐标列表是一个幸运的猜测,可以将(x,y)坐标组合成元组(而不是子数组)。然后我研究了“rain”示例:它显示了一个使用numpy数组来管理坐标和属性的实现(非常优雅的IMHO)。这使我正确地使用了np.array。你是对的,文档在这方面缺乏。我找到了一个教程,说明了(x,y)的用法元组作为matplotlib文档中的坐标:
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,