You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Matplotlib动画中仅保留单个颜色条

解决Matplotlib动画重复生成颜色条的问题

你的问题核心是:ax.clear()只会清除坐标轴区域的内容,但颜色条是绑定在figure上的,每次调用fig.colorbar()都会新增一个,最终导致颜色条堆叠。

下面提供两种可行的解决方案:

方案一:提前初始化颜色条,仅更新数据(推荐)

这种方法只在初始化时创建一次图像和颜色条,后续帧只更新数据和颜色范围,效率更高:

import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
import numpy as np

fig, ax = plt.subplots()

# 初始化图像和颜色条
np.random.seed(0)
z_init = np.random.rand(20, 20)
im = ax.imshow(z_init, origin='lower')
cbar = fig.colorbar(im, ax=ax, orientation='vertical')

def animate(i):
    np.random.seed(i)
    z = np.random.rand(20, 20)
    # 更新图像数据
    im.set_data(z)
    # 更新颜色条的数值范围
    im.set_clim(vmin=z.min(), vmax=z.max())
    # 若数据范围固定(比如始终0-1),可去掉上一行,颜色条范围保持不变
    return im, cbar

ani = FuncAnimation(fig, animate, frames=20, interval=50, repeat=False, blit=True)

plt.tight_layout()
plt.show()

方案二:每次更新时删除旧颜色条

如果必须在每一帧重新创建图像,可在创建新颜色条前先移除之前的颜色条:

import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
import numpy as np

fig, ax = plt.subplots()
# 存储颜色条对象,用于后续删除
cbar = None

def animate(i):
    global cbar
    ax.clear()
    np.random.seed(i)
    z = np.random.rand(20, 20)
    im = ax.imshow(z, origin='lower')
    
    # 删除已存在的颜色条
    if cbar is not None:
        cbar.remove()
    # 创建新颜色条
    cbar = fig.colorbar(im, ax=ax, orientation='vertical')
    return im, cbar

ani = FuncAnimation(fig, animate, frames=20, interval=50, repeat=False)

plt.tight_layout()
plt.show()

说明:方案一的blit=True可以提升动画渲染效率,仅更新画面中变化的部分。

内容的提问来源于stack exchange,提问作者Sunny

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 17:32:41