我正在尝试通过加载每帧的
numpy
数组来对之前保存的数据进行动画处理。
我的代码如下:
fig, ax = plt.subplots(1, 1, constrained_layout = False)
def routine(omega):
omega_plot = ax.pcolormesh(x_grid, y_grid, omega, cmap = 'coolwarm')
ax.set_aspect('equal')
ax.set_xlim(0, 2 * np.pi)
ax.set_ylim(0, 2 * np.pi)
divider = make_axes_locatable(omega_plot.axes)
cax = divider.append_axes("right", size = "5%", pad = 0.2)
fig.colorbar(omega_plot, cax = cax, orientation = 'vertical')
cax.set_ylabel(r"$\mathrm{mag}\left[ \vec{u} \right]$")
ax.set_title(r"$\omega(t)")
# some plot routine parts excluded
return ax
def init():
omega = np.load("pcolor Animation/temp/omega_ana, n = 0.npy")
return routine(omega)
def update(n):
print(n)
omega = np.load("pcolor Animation/temp/omega_ana, n = {0}.npy".format(n))
return routine(omega)
ANI = FuncAnimation(fig, update, frames = range(0, 2000, 10), init_func = init)
ANI.save("pcolor Animation/Taylor-Greene Vortex Animation.mp4", fps = 180, dpi = 200)
当我运行它时,我得到以下信息: 现在看来,这实际上是正确的。泰勒-格林流呈指数衰减,但其他方面不会改变,但也很明显,每次都会重新绘制颜色条,从而导致“漂移”。此外,代码每帧都会变慢,因为它是在前一帧的基础上绘制的。
如果我们将
plt.clf()
或 fig.clear()
或各种 Stack Overflow 答案建议的有关 matplotlib.animation
的任何其他建议添加到 routine(omega)
的顶部,我们会得到以下结果:
这次,我们的颜色条是正确的,动画运行得更快,但数据本身丢失了。
我错过了什么?我已经完成了尽职调查,并尝试根据其他各种类似问题的建议来解决这个问题,并且已经遇到这个问题几天了。我将不胜感激任何帮助,并提前感谢您。
为了使动画高效,我们希望更新尽可能少。因此,请预先创建艺术家,然后更新
QuadMesh
艺术家中使用的数组(从 pcolormesh
返回)。另外,更新 QuadMesh
使用的规范将使颜色条的范围发生变化。
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
from matplotlib.colors import Normalize
from mpl_toolkits.axes_grid1.axes_divider import make_axes_locatable
import numpy as np
fig, ax = plt.subplots()
omega_plot = ax.pcolormesh(np.zeros((10, 10)), cmap='Blues', vmin=0, vmax=100)
ax.set_aspect('equal')
divider = make_axes_locatable(omega_plot.axes)
cax = divider.append_axes("right", size = "5%", pad = 0.2)
fig.colorbar(omega_plot, cax = cax, orientation = 'vertical')
cax.set_ylabel(r"$\mathrm{mag}\left[ \vec{u} \right]$")
ax.set_title(r"$\omega(t)$")
def update(n):
omega = np.arange(100).reshape(10, 10) * 0.99**n
omega_plot.set_array(omega)
# Change the valid range of the data (remove this line for the colorbar to be constant).
omega_plot.set_norm(Normalize(vmin=omega.min(), vmax=omega.max()))
ANI = FuncAnimation(fig, update, frames = range(0, 200, 10))
ANI.save("test.gif", fps = 10)
上面的代码产生
如果我们删除
update
函数的最后一行,我们会得到