2017-07-17 266 views
1

我想要遵循位于here的基本动画教程,并调整它以显示一个已经计算好的数据集,而不是每帧评估一个函数,但是会陷入困境。我的数据集涉及一段时间内的XY坐标,包含在列表satxpossatypos中我试图创建一个动画,以便从数据集开始处到最后一行开始追踪一行,每0.1秒显示一个新点。任何帮助,我要去哪里错了?matplotlib动画散点图

from matplotlib import pyplot as plt 
from matplotlib import animation 
import numpy as np 

Code here creates satxpos and satypos as lists 

fig = plt.figure() 
ax = plt.axes(xlim=(-1e7,1e7), ylim = (-1e7,1e7)) 
line, = ax.plot([], [], lw=2) 

def init(): 
    line.set_data([], []) 
    return line, 

def animate(i): 
    line.set_data(satxpos[i], satypos[i]) 
    return line, 

anim = animation.FuncAnimation(fig, animate, init_func=init, 
           frames = len(satxpos), interval = 1, blit=True) 

编辑:代码运行没有错误,但生成一个空白绘图窗口,没有显示点/线,没有任何动画。该数据集正确生成并在静态图中可以正常显示。

+0

这是你的全部代码吗?运行它时是否收到任何错误消息? – cosinepenguin

+0

这不是所有的代码,生成satxpos和satypos的部分都会创建有效的数据集。我可以将这些视为一个静态的情节。代码运行时没有错误,但生成的图只是一个空白窗口,没有显示动画或点/线 –

+0

您在代码中的某处使用'anim.save()'和'plt.show()'没有分享? – cosinepenguin

回答

3

为了“追查一条线年底开始在数据集的开头”你会索引您的阵列包含每个时间步长多了一个元素:

line.set_data(satxpos[:i], satypos[:i]) 

(注意:!)

代码中的其他部分看起来很好,这样,通过上述操作,您应该可以获得并延伸线条图。您可能会想要将interval设置为大于1的值,因为这意味着1毫秒的时间步长(可能有点太快)。我想用interval = 40可能是一个好的开始。

+0

解决了它,完全按照我现在的意图工作。谢谢! –

1

您的代码看起来正确!只要satxpos和satypos都正确配置和初始化,我相信其他一切都是有效的!

你不要在你的问题显示代码的一部分是的anim.save()plt.show()功能,都需要为您的代码工作调用(按照您共享的教程!)

你会因此需要添加如下内容:

anim.save('basic_animation.mp4', fps=30, extra_args=['-vcodec', 'libx264']) 

plt.show() 

到您的代码的结尾创建动画(并显示它,我假设)!

希望它有帮助!

Source - Matplotlib Animation Tutorial

1

我看到你所提到的“生成satxpos和satypos做创建有效的数据集的部分。我可以查看那些作为静态情节就好了”。但我的猜测仍然是来自您的satxpossatypos的问题。

解决问题的一种方法是用line.set_data(satxpos[i], satypos[i])替换你的两个函数和动画代码。将i设置为0,1,...并查看您是否可以看到该图。如果不是,您的satxpossatypos不像您声称的那样有效。

举个例子,一个有效的satxpossatypos可以是这样的:

x = np.array([np.linspace(-1e7, 1e7, 1000)]) 
i = 200 
satxpos = x.repeat(i, axis=0) 
satypos = np.sin(2 * np.pi * (satxpos - 0.01 * np.arange(i).reshape(-1, 1).repeat(satxpos.shape[1], axis=1))) 
satypos *= 1e7/2 

这个工程的代码,你只要从而表明您已经证明了我们的代码是好的。

编辑回应评论:

如果您satxpossatypos只是np.linespace,动画循环将得到的只是一个点与(satxpos[i], satypos[i]),你不会看到在图上点不一样marker='o'的设置。因此,你在动画中看不到任何东西。