如何移除Matplotlib子图图例中的重复标签
解决Matplotlib图例重复标签的问题
要去掉图例里的重复项,最直接的办法是利用字典键不能重复的特性来过滤——把标签当键,对应的图例元素(线条、散点标记)当值,重复标签会自动被过滤掉,最后用去重后的内容生成图例即可。
下面是修改后的完整代码:
import matplotlib.pyplot as plt import numpy as np fig = plt.figure() ax1 = fig.add_subplot(221) ax2 = fig.add_subplot(222) ax3 = fig.add_subplot(223) ax4 = fig.add_subplot(224) ax1.scatter(1,2,label='a',color='black') ax1.plot(np.array([1, 2]), np.array([1, 2]),color='b',label='xvalues') ax2.scatter(3,4,label='a',color='black') ax3.scatter(5,6,label='b',color='red') ax4.scatter(7,8,label='b',color='red') # 收集所有子图的图例元素和标签 lines_labels = [ax.get_legend_handles_labels() for ax in fig.axes] lines, labels = [sum(lol, []) for lol in zip(*lines_labels)] # 手动遍历,保留每个标签第一次出现的图例元素 unique_items = {} for line, label in zip(lines, labels): if label not in unique_items: unique_items[label] = line # 提取去重后的标签和元素 unique_lines = list(unique_items.values()) unique_labels = list(unique_items.keys()) # 生成只含唯一标签的图例 fig.legend(unique_lines, unique_labels, scatterpoints = 1) plt.show()
关键逻辑说明:
- 遍历收集到的所有图例元素和标签,遇到未记录的标签就存入字典,已存在的标签直接跳过,保证每个标签只保留第一次出现的对应元素。
- 最后从字典中提取值(图例元素)和键(标签),用来生成最终图例,就能得到仅含1个'a'、1个'b'和1个'xvalues'的结果。
内容的提问来源于stack exchange,提问作者neo
相关产品推荐
相关产品推荐

