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

如何让Matplotlib图例标签仅显示一次并使用迭代变量

问题解决:动画中更新单一图例标签的实现

你的问题核心在于每次循环都重复添加新的水平线和调用图例,导致图例累积了所有历史标签。以下是修改后的代码及关键说明:

修改后的代码

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.patches as mpatches
from matplotlib.animation import Camera

# 假设x、y为已定义的随机点示例
x = np.random.uniform(-1, 1, 20)
y = np.random.uniform(-1, 1, 20)

radius_list = np.linspace(0, 1, 12)  # 重命名变量,避免覆盖内置list
death_list = np.array((.1, .2, .3, .4, .8))

fig, (ax1, ax2) = plt.subplots(1, 2)
camera = Camera(fig)

# --- 初始化固定元素(仅执行一次)---
# ax1初始化:绘制散点并设置固定样式
ax1.scatter(x, y, color="green", marker="o", s=15)
ax1.set_aspect('equal', adjustable='datalim')
ax1.set_title('Random Points on a Circle')
ax1.set(xlabel='x-axis', ylabel='y-axis')
ax1.set_xlim([-1.25, 1.25])
ax1.set_ylim([-1.25, 1.25])

# 预创建圆形补丁,后续仅更新半径
circles = []
for xx, yy in zip(x, y):
    cir = mpatches.Circle((xx, yy), 0, color='r', fill=True, zorder=0)
    ax1.add_patch(cir)
    circles.append(cir)

# ax2初始化:绘制固定蓝色线并设置样式
a = np.arange(0, 1.1, .1)
ax2.plot(a, a, color='b')
ax2.set_aspect('equal', adjustable='datalim')
ax2.set_title('Persistence Diagram')
ax2.set(xlabel='Birth', ylabel='Death')

# 初始化水平线和死亡标记容器
hline = ax2.axhline(y=0, label=f'current radius = {0:.2f}', color='r', linestyle='-')
death_markers = []

# --- 动画循环(仅更新动态元素)---
for i in radius_list:
    # 更新ax1的圆形半径
    for cir in circles:
        cir.set_radius(i)
    
    # 更新ax2的水平线位置和标签
    hline.set_ydata(i)
    hline.set_label(f'current radius = {i:.2f}')  # 格式化保留两位小数,提升可读性
    
    # 更新死亡标记:先清除旧标记,再添加新标记
    for marker in death_markers:
        marker.remove()
    death_markers.clear()
    if i in death_list:
        marker, = ax2.plot(0, i, marker="o", markersize=5, markeredgecolor="green", markerfacecolor="green")
        death_markers.append(marker)
    
    # 更新图例(仅显示当前标签)
    ax2.legend(loc='lower right')
    
    # 捕捉当前帧
    camera.snap()

# 生成并展示动画
animation = camera.animate()
plt.show()

关键修改说明

  1. 避免重复创建元素:将散点、蓝色基准线等固定元素移到循环外,仅初始化一次;圆形补丁预创建后仅更新半径,减少内存占用和绘制冗余。
  2. 单一水平线对象更新:用变量保存水平线实例,每次循环仅更新其位置和标签,而非新建水平线,避免图例累积。
  3. 动态维护死亡标记:用列表保存死亡标记实例,每次循环先清除旧标记再添加新标记,避免标记叠加。
  4. 格式化标签:用{i:.2f}格式化半径值,避免浮点数精度导致的过长小数显示。

内容的提问来源于stack exchange,提问作者The Mad Scientist

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 11:40:24