我模拟了很多时间步骤,并且涉及很多步骤。我想动画我的结果,每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 :(得分: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'])
谢谢你指出这一点。