如何让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()
关键修改说明
- 避免重复创建元素:将散点、蓝色基准线等固定元素移到循环外,仅初始化一次;圆形补丁预创建后仅更新半径,减少内存占用和绘制冗余。
- 单一水平线对象更新:用变量保存水平线实例,每次循环仅更新其位置和标签,而非新建水平线,避免图例累积。
- 动态维护死亡标记:用列表保存死亡标记实例,每次循环先清除旧标记再添加新标记,避免标记叠加。
- 格式化标签:用
{i:.2f}格式化半径值,避免浮点数精度导致的过长小数显示。
内容的提问来源于stack exchange,提问作者The Mad Scientist
相关产品推荐
相关产品推荐

