matplotlib保存动画的每n个步骤

时间:2017-01-13 14:54:00

标签: python animation matplotlib

我模拟了很多时间步骤,并且涉及很多步骤。我想动画我的结果,每n只绘制一步。

现在我有两个不工作的命题。第一个似乎没有正确循环,第二个仍然用图中未更新的步骤填充视频,使文件变大和变慢。

你能帮助我吗?

由于

X, Y = np.meshgrid(256,256)
fig,ax = plt.subplots()
plot_every = 50
saved_steps = []
def make_step(s, t):
c = ...
    if (s%plot_every) == 0:
        print("plotting step {:.0f} , t ={:.0f} ".format(s, t*dt))
        ax.clear()
        ax.contourf(X, Y, c,
                np.arange(0, 1.0, 0.01),
                extend='both')
        saved_steps.append(ax)

for s , t in enumerate(range(t_steps)):
    make_step(s,t)

print("will now save anim")
def plot_ani(i):
    return saved_steps[i]

 anim = animation.FuncAnimation(fig, plot_ani,range(len(saved_steps)) , interval=500,  blit=False)

或:

fig,ax = plt.subplots()
saved_steps = []
def make_step(s, t):  
    if (s%plot_every) == 0:
        print("plotting step {:.0f} , t ={:.0f} ".format(s, t*dt))
        ax.clear()
        ax.contourf(X, Y, c,
                np.arange(0, 1.0, 0.01),
                extend='both')
        return ax

 anim = animation.FuncAnimation(fig, make_step,range(len(saved_steps)) , interval=500,  blit=False)

然后我做

anim.save('spinodal_decompo_ex.ogv',  codec='libtheora')

2 个答案:

答案 0 :(得分:2)

第一种方法的问题是您尝试将matplotlib axes对象存储在列表中。但是,您在列表中存储的ax始终是相同的。一旦您拨打ax.clear(),即使之前保存的ax对象也会被清除。

第二种方法的问题是FuncAnimation将始终保存每个时间步的数字。无论你是否改变轴上的东西都没关系。

转向解决方案:
始终明智的原则是将数据生成和计算与数据可视化分开 因此,建议是

首先计算数据。

time_steps = 10000
data = []
for t in range(time_steps):
    d = calculate_data(t)
    data.append(d)
    # alternatively save data to file
    # if it's to big to be kept in memory.

然后才开始可视化

# now start visualizing
plot_every = 50
fig, ax = plt.subplots()

def make_step(step):  
    ax.clear()
    # recall data from list, but take only every 50th entry
    c = data[step*plot_every]  #alternatively reload data from file
    ax.contourf(X, Y, c, ...)

anim = animation.FuncAnimation(fig, make_step,range(time_steps//plot_every), interval=500)

答案 1 :(得分:0)

基于重要性的回答,这是我想出的。另外一点是contourf不是artist,显然......

fig = plt.figure()

saved_steps = []
def make_step(i, t):
    c = ...
    if (i%plot_every) == 0:
        print("plotting step {:.0f} , t ={:.0f} ".format(i, t*dt))
        im = plt.imshow(c, animated=True)
        saved_steps.append([im])

for s , t in enumerate(range(t_steps)):
    make_step(s, t)

print("will now save anim")
anim = animation.ArtistAnimation(fig, saved_steps, interval=50, blit=False)

anim.save('spinodal_decompo_ex.ogv',  codec='libtheora', extra_args=['-qscale:v',  '7'])

谢谢你指出这一点。