我正在模拟具有多个时间步长的东西,并且涉及很多步骤。我想将我的结果动画化,每 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')
最佳答案
第一种方法的问题是您尝试将 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)
关于python - matplotlib 保存每 n 个步骤的动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41637343/