折线图自定义图例标签与图形样式不匹配,如何获取正确图例句柄?
问题:自定义图例句柄与图表样式不匹配,如何获取带自定义名称的正确句柄?
我使用如下代码绘制折线图:
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
相关产品推荐
相关产品推荐

