如何使用matplotlib.animation对python中的数据图进行动画处理

时间:2019-04-01 05:04:50

标签: python matplotlib animation

我有两个数组x和y,每个数组都有超过365000个元素。我想使用这些数组元素绘制一条动画线。我正在使用matplotlib.animation。问题是当我执行下面的代码时,我看不到平滑(动画)绘制的图形。相反,我看到它是最终的绘制版本。

This is what I obtain

这是我的代码:

#libs
# Movement instance creation-----------------------------
movement1=Movement(train1, track1)
# # Move the train on the track

movement1.move()
y = movement1.speed
x = movement1.pos

Writer = animation.writers['ffmpeg']
writer = Writer(fps=20, metadata=dict(artist='Me'), bitrate=1800)

fig = plt.figure()
ax = plt.axes(xlim=(0, 25), ylim=(0, 300))
line, = ax.plot([], [], lw=2)
# initialization function: plot the background of each frame
def init():
    line.set_data([], [])
    return line,

# animation function.  This is called sequentially
def animate(i):
    line.set_data(x, y)
    return line,

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


anim.save('basic_animation.mp4', writer=writer)

这是我期望的类似结果:

Here is the similar result that I expect.

我的图当然是另一条曲线。

2 个答案:

答案 0 :(得分:0)

您需要定义一组数据,这些数据会随着动画的发生而发生变化。在您给出的示例站点中,作者通过使用overdose.iloc [:int(i + 1](请参见下面的实际代码)对数据进行切片来做到这一点。这是在matplotlib绘制任何数据时创建动画的部分在动画函数中。在您的代码中,您输入的是line.set_data(x,y),我想是您的整个数据集。这就是为什么它不动的原因。

def animate(i):
    data = overdose.iloc[:int(i+1)] #select data range
    p = sns.lineplot(x=data.index, y=data[title], data=data, color="r")
    p.tick_params(labelsize=17)
    plt.setp(p.lines,linewidth=7)

要注意的第二件事是您的剧情在顶部被砍掉。这可能是因为您的初始化已经错误地设置了轴。我要做的是添加一个plt.axis([0,25,0,'upper limit'])来帮助正确设置轴。

答案 1 :(得分:0)

您的代码基本上没问题;您只需要做三件事。

  1. 每次xdata的迭代时,将行的ydataanim_func设置为不同的值(否则,将没有动画,会吗?)

  2. 设置恒定的轴限制,以使绘图不改变形状

  3. 删除save调用以用于显示(对我个人而言,我发现它会影响动画)

所以:

ax.axis((x.min(), x.max(), y.min(), y.max())

def animate(i):
    line.set_data(x[:i], y[:i])
    return line,