如何编写Matplotlib双Y轴通用自定义图例函数?
实现Matplotlib双Y轴统一图例的通用函数
直接上解决方案,这个函数可以自动抓取当前子图及其所有双Y轴的带标签线条,生成统一图例,不用手动管理变量名:
import matplotlib.pyplot as plt def unified_legend(): # 获取当前活跃的子图 ax = plt.gca() # 收集所有相关轴:主轴 + 所有关联的双轴 axes = [ax] # 遍历子图所在figure的所有轴,找出和当前ax配对的twin轴(共享同一绘图区域) for other_ax in ax.get_figure().get_axes(): if other_ax is not ax and other_ax.bbox.bounds == ax.bbox.bounds: axes.append(other_ax) # 收集所有带有效标签的线条(排除Matplotlib默认的无图例标签) lines = [] labels = [] for axis in axes: for line in axis.get_lines(): label = line.get_label() if label != '_nolegend_': lines.append(line) labels.append(label) # 在主轴上生成统一图例 ax.legend(lines, labels, loc='upper right')
使用示例
画双Y轴图时,无需手动传递轴对象或线条变量,直接调用函数即可:
# 示例绘图流程 fig, ax1 = plt.subplots() ax1.plot([1,2,3], [4,5,6], label='主轴数据') ax2 = ax1.twinx() ax2.plot([1,2,3], [10,20,15], color='r', label='次轴数据') # 生成统一图例 unified_legend() plt.show()
核心逻辑说明
plt.gca()自动获取当前正在操作的子图,无需手动传入轴变量- 通过对比轴的边界框,筛选出与当前子图共享绘图区域的双Y轴
- 过滤掉无自定义标签的线条(Matplotlib默认给无标签线条分配
_nolegend_标记) - 基于主轴生成包含所有有效线条的统一图例
如果画布有多个子图,该函数仅处理当前活跃的子图,完全无需关注双轴的命名。
内容的提问来源于stack exchange,提问作者user20856754
相关产品推荐
相关产品推荐

