如何在Matplotlib中同时添加自定义图例与默认图例
同时保留Matplotlib默认图例与自定义图例的方法
要同时保留默认生成的图例和自定义图例,核心思路是先收集默认图例的元素,再和自定义元素合并后统一生成图例,具体步骤如下:
- 先绘制所有带
label的默认图形元素(比如你用的plt.axvline) - 获取当前坐标轴上所有默认图例的句柄(handles)和标签(labels)
- 定义你的自定义图例元素(
Line2D或Patch) - 合并默认元素和自定义元素,最后调用
legend()生成包含所有内容的图例
完整代码示例
import matplotlib.pyplot as plt from matplotlib.lines import Line2D from matplotlib.patches import Patch # 1. 绘制带标签的默认图形 plt.axvline(x=2, color='red', lw=2, label='Vertical Line') plt.plot([0, 4], [0, 4], color='blue', label='Diagonal Line') # 2. 获取默认图例的句柄和标签 ax = plt.gca() # 获取当前坐标轴对象 default_handles, default_labels = ax.get_legend_handles_labels() # 3. 定义自定义图例元素 custom_elements = [ Line2D([0], [0], color='green', lw=4, label='Custom Line'), Line2D([0], [0], marker='o', color='w', markerfacecolor='orange', markersize=15, label='Custom Scatter'), Patch(facecolor='purple', edgecolor='black', label='Custom Patch') ] # 4. 合并默认与自定义元素 all_handles = default_handles + custom_elements all_labels = default_labels + [elem.get_label() for elem in custom_elements] # 5. 生成包含所有内容的图例 plt.legend(handles=all_handles, labels=all_labels) plt.show()
关键说明
ax.get_legend_handles_labels()会自动收集当前坐标轴上所有带有label参数的绘图元素,不管你有没有提前调用过plt.legend()- 合并时直接把默认句柄和自定义元素列表相加,标签同理(自定义元素的标签可以通过
get_label()获取,也可以手动写) - 不要分开调用两次
plt.legend(),那样第二次会覆盖第一次的图例,合并后只调用一次就能同时显示所有内容
内容的提问来源于stack exchange,提问作者akopty
相关产品推荐
相关产品推荐

