Matplotlib 动画,要么运行缓慢并重新绘制颜色条,要么缺少绘图

问题描述 投票:0回答:1

我正在尝试通过加载每帧的

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)
的顶部,我们会得到以下结果: 这次,我们的颜色条是正确的,动画运行得更快,但数据本身丢失了。

我错过了什么?我已经完成了尽职调查,并尝试根据其他各种类似问题的建议来解决这个问题,并且已经遇到这个问题几天了。我将不胜感激任何帮助,并提前感谢您。

python matplotlib matplotlib-animation
1个回答
0
投票

为了使动画高效,我们希望更新尽可能少。因此,请预先创建艺术家,然后更新

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
函数的最后一行,我们会得到

© www.soinside.com 2019 - 2024. All rights reserved.