2017-01-13 76 views
1

我正在模拟许多时间步骤,并且涉及很多步骤。我想动画我的结果,每n绘制一个步骤。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') 

回答

0

基于ImportanceofBeingErnest答案,这里是我想出了。额外的东西,是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']) 

感谢您指出了这一点。

+0

保存matplotlib对象会产生大量不必要的开销。坚持分离原则会消除这一点。但这当然是你自己的选择。 – ImportanceOfBeingErnest

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) 
+0

谢谢,它帮助我找到了解决方案! – Napseis