如何在Matplotlib中将两个图例合并为带中点的十字形图例?
解决Matplotlib图例重复+自定义带中点十字标记的方法
核心思路
直接手动创建十字标记+圆点标记的组合图例,替代原来两个重复的"Data"图例条目,既解决重复问题又实现需求样式。
具体实现步骤
- 绘制errorbar和stairs时不设置label,避免自动生成重复图例
- 创建两个独立的标记对象:十字形和圆形
- 用
HandlerTuple将两个标记叠加组合成一个图例条目
完整代码示例
import matplotlib.pyplot as plt from matplotlib.legend_handler import HandlerTuple # 模拟数据 x = [1, 2, 3, 4, 5] y = [2, 4, 3, 5, 4] y_err = [0.3, 0.2, 0.4, 0.3, 0.2] # 绘制errorbar(不设置label) error_bar = plt.errorbar(x, y, yerr=y_err, fmt='none', capsize=5) # 绘制stairs(不设置label) stairs_line = plt.stairs(y, x, fill=False) # 获取图表元素的颜色,保证图例和绘图颜色一致 plot_color = error_bar.lines[0].get_color() # 创建十字形标记 cross_marker = plt.Line2D([], [], marker='+', color=plot_color, linestyle='none', markersize=12) # 创建圆形标记,叠加在十字中间 dot_marker = plt.Line2D([], [], marker='o', color=plot_color, linestyle='none', markersize=6) # 组合标记并生成最终图例 plt.legend([(cross_marker, dot_marker)], ['Data'], handler_map={tuple: HandlerTuple(ndivide=None)}) plt.show()
关键细节说明
HandlerTuple(ndivide=None):强制两个标记完全叠加,而非并排显示- 从已绘制元素中提取颜色:避免手动指定颜色导致的图例与图表颜色不一致
- 若已为errorbar和stairs设置label,可通过
plt.gca().get_legend_handles_labels()获取后过滤重复项,但手动创建图例的方式更直接可控
内容的提问来源于stack exchange,提问作者J.W Kang
相关产品推荐
相关产品推荐

