循环中图例显示异常:仅展示最后一条曲线标签求助
解决Matplotlib图例仅显示最后一条曲线标签的问题
我来帮你搞定这个图例显示的麻烦!你的代码里有几个关键问题导致了图例只显示最后一条、重复标签的情况,咱们一步步修正:
问题根源分析
- 循环内频繁重置图例:你在
z循环里每次调用plt.legend([l1], [...]),这会直接替换掉之前的图例,最终只会保留最后一次循环生成的标签。 - 重复绘制同一分组的曲线:
z循环会为同一个Ju值重复执行10次,每次都添加相同的图例标签,导致大量重复项。 - 图例逻辑错位:你需要按
Ju值(1-7)分组显示图例,但当前代码的图例设置和循环逻辑不匹配。
修改后的代码
import matplotlib.pyplot as plt import numpy as np # 假设ET、Bcmb、B是已定义的函数,dfimppara、ng、Tg是已加载的数据 for x in range(len(ng)): fig, ax1 = plt.subplots(1, figsize=(9,6)) plt.subplots_adjust(wspace=0.5, hspace=0.1) # 用字典存储每个Ju对应的线条对象,确保同一Ju只生成一个图例标签 ju_line_map = {} for xx in range(1, 819): Ju = dfimppara.iloc[xx, 1] Jl = dfimppara.iloc[xx, 2] lim = Ju - Jl # 提前过滤不符合条件的项,减少嵌套层级 if lim > 1 or Ju >= 8: continue # 为当前xx的所有z值准备数据 ET_list = [] z_list = [] for z in np.arange(0, 11): T = ET(xx, z, ng[x], 1e-24, Tg[x], 1) BC = Bcmb(xx,z) Btex = B(xx,T) ET_list.append(1 - BC/Btex) z_list.append(z) # 绘制曲线并管理图例 if Ju not in ju_line_map: # 第一次绘制该Ju的曲线,保存线条对象并设置标签 line, = ax1.plot(z_list, ET_list, label=f'{Ju}') ju_line_map[Ju] = line else: # 已有该Ju的图例,直接绘制曲线不重复添加标签 ax1.plot(z_list, ET_list) # 所有曲线绘制完成后统一设置图例和标题 ax1.set_title(f'UF=1e-24,Tg={Tg[x]},ng={ng[x]}') ax1.set_ylabel('1-BB(CMB)/BB(Tex)') ax1.set_xlabel('z') # 使用字典中保存的线条对象生成图例,确保只显示1-7的唯一标签 plt.legend(handles=ju_line_map.values()) plt.show()
关键修改说明
- 字典管理图例线条:
ju_line_map字典记录每个Ju对应的线条实例,确保同一个Ju只在图例中出现一次,彻底解决重复标签问题。 - 调整数据准备逻辑:把
ET_list和z_list的初始化移到xx循环内,为每个xx一次性收集所有z值对应的数值,再绘制完整曲线(之前的写法会重复绘制同一条曲线10次)。 - 提前过滤无效项:将不符合条件的
lim>1和Ju>=8判断提前,简化代码嵌套结构,提升可读性。 - 统一设置图例:把
plt.legend()移到所有绘图完成后,用字典中存储的线条对象生成图例,确保所有1-7的标签都能正确显示。
内容的提问来源于stack exchange,提问作者Ma Y
相关产品推荐
相关产品推荐

