You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 19:09:54