Matplotlib动画异常:运行卡顿色条重复,或清除后缺失绘图
解决Matplotlib动画色条重复、卡顿问题
你的问题根源在于每次帧更新都重复创建绘图元素(包括色条),导致内存堆积卡顿,色条多次添加偏移;而用plt.clf()会清空整个画布,连坐标轴都删了,自然没绘图内容。
修正思路:
只在初始化时创建一次固定元素(坐标轴配置、色条),后续帧只更新可变的数据部分(热力图数据、标题文本),避免重复创建对象占用内存。
修正后的代码:
import numpy as np import matplotlib.pyplot as plt from matplotlib.animation import FuncAnimation from mpl_toolkits.axes_grid1 import make_axes_locatable # 假设x_grid和y_grid是提前定义好的全局变量 x_grid = np.linspace(0, 2*np.pi, 100) y_grid = np.linspace(0, 2*np.pi, 100) fig, ax = plt.subplots(1, 1, constrained_layout=False) # 初始化固定的坐标轴配置(只做一次) ax.set_aspect('equal') ax.set_xlim(0, 2 * np.pi) ax.set_ylim(0, 2 * np.pi) def init(): # 加载初始帧数据 omega = np.load("pcolor Animation/temp/omega_ana, n = 0.npy") # 创建初始热力图,保存对象用于后续更新 global omega_plot omega_plot = ax.pcolormesh(x_grid, y_grid, omega, cmap='coolwarm') # 创建色条(只做一次) divider = make_axes_locatable(ax) 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]$") # 初始化标题 global title title = ax.set_title(r"$\omega(t=0)$") return [omega_plot, title] def update(n): print(n) # 加载当前帧数据 omega = np.load("pcolor Animation/temp/omega_ana, n = {0}.npy".format(n)) # 只更新热力图的数据,不需要重新创建pcolormesh omega_plot.set_array(omega.ravel()) # pcolormesh需要一维数组,所以展平 # 更新标题文本 title.set_text(r"$\omega(t={})$".format(n)) return [omega_plot, title] # 生成动画,启用blit=True提升渲染效率 ANI = FuncAnimation(fig, update, frames=range(0, 2000, 10), init_func=init, blit=True) ANI.save("pcolor Animation/Taylor-Greene Vortex Animation.mp4", fps=180, dpi=200)
关键改动说明:
- 把坐标轴的
aspect、xlim、ylim等固定配置放在初始化代码最外层,只执行一次 init函数只创建一次热力图对象和色条,保存为全局变量(简单场景下的便捷方案)update函数仅更新热力图的数组(用set_array)和标题文本,不重复创建任何绘图元素- 启用
blit=True,只重绘变化的部分,大幅提升动画流畅度
这样既解决了色条重复偏移的问题,又避免了内存堆积导致的卡顿,同时不会清空画布丢失内容。
内容的提问来源于stack exchange,提问作者Jacob Ivanov
相关产品推荐
相关产品推荐

