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

折线图自定义图例标签与图形样式不匹配,如何获取正确图例句柄?

问题:自定义图例句柄与图表样式不匹配,如何获取带自定义名称的正确句柄?

我使用如下代码绘制折线图:

comp_fib1=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,2,3,6,7,7,11,18,30,47,88,143]
comp_fib2=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]


import matplotlib.pyplot as plt
import seaborn as sns

sns.lineplot(
    data=[comp_fib1,comp_fib2],legend=False,markers=['*','o'],palette='colorblind')
plt.legend(title='Fibonacci series',loc='upper left',labels={'fib1','fib2'})
plt.gca().get_legend_handles_labels()

生成的折线图

自定义图例句柄后,发现图例样式与图中折线不匹配,请问如何获取带有自定义名称的正确图例句柄?


解决方案

直接调用plt.legend()仅传入labels时,Matplotlib会生成全新的默认句柄,不会复用Seaborn绘制的折线样式,导致匹配失效。正确做法是先获取Seaborn绘制后的真实句柄,再替换自定义标签:

修正后的代码

comp_fib1=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,2,3,6,7,7,11,18,30,47,88,143]
comp_fib2=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]

import matplotlib.pyplot as plt
import seaborn as sns

# 绘制折线并获取轴对象
ax = sns.lineplot(
    data=[comp_fib1, comp_fib2], legend=False, markers=['*','o'], palette='colorblind')

# 获取已绘制折线的句柄(包含样式信息)
handles, _ = ax.get_legend_handles_labels()

# 传入句柄和自定义标签生成匹配的图例
plt.legend(title='Fibonacci series', loc='upper left', handles=handles, labels=['fib1', 'fib2'])

plt.show()

关键说明

  • 通过ax.get_legend_handles_labels()获取的handles是Seaborn绘制的折线实例,包含了图表中的标记、颜色等样式
  • 调用plt.legend()时同时传入handles和labels,确保图例复用折线的真实样式,同时使用自定义名称
  • 注意labels要使用有序列表而非集合,集合的无序性可能导致标签与折线顺序不对应

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 03:20:20