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

使用ax.secondary_yaxis绘双Y轴时转换函数含额外变量报错如何解决

错误原因

ax.secondary_yaxis()要求传入的两个转换函数必须实现全局固定的一一映射:函数的输入是主/次Y轴的全局刻度值(默认仅传入刻度范围的两个端点,形状为(2,)),输出是对应的次/主Y轴刻度值。
你当前代码报错的直接原因是:长度为100的数组k和输入的2个刻度值做乘除运算时,形状不匹配无法广播。
更核心的逻辑问题:你的转换逻辑中k随x变化,同一个主Y轴数值在不同x位置会对应不同的次Y轴数值,而次Y轴是全局统一刻度的坐标轴,不存在随x动态变化的刻度规则,这种场景本身不符合secondary_yaxis的适用条件。

解决思路

根据你的实际需求选择对应方案:

  • 场景1:k为固定常量,无需随x变化
    将k修改为单个数值即可,修改后可正常运行,示例代码如下:
    import numpy as np
    import matplotlib.pyplot as plt
    
    x = np.linspace(0, 50, 100)
    y = np.linspace(220, 273, 100)
    k = 5 # 改为固定常量
    
    def y_to_y2(y):
        return y * k
    def y2_to_y(y2):
        return y2 / k
    
    fig, ax = plt.subplots()
    ax2 = ax.secondary_yaxis("right", functions=(y_to_y2, y2_to_y))
    ax.plot(x, y)
    plt.show()
    
  • 场景2:k确实随x变化,需要展示对应的y2序列
    放弃使用secondary_yaxis,改用ax.twinx()创建独立的右侧Y轴,直接绘制y2序列即可,示例代码如下:
    import numpy as np
    import matplotlib.pyplot as plt
    
    x = np.linspace(0, 50, 100)
    y = np.linspace(220, 273, 100)
    k = np.linspace(-10, 10, 100)
    y2 = y * k # 提前计算好对应y2序列
    
    fig, ax = plt.subplots()
    ax.plot(x, y, label='主Y轴序列')
    ax.legend(loc='upper left')
    # 创建独立的右侧Y轴
    ax2 = ax.twinx()
    ax2.plot(x, y2, c='orange', label='次Y轴序列')
    ax2.legend(loc='upper right')
    plt.show()
    

内容的提问来源于stack exchange,提问作者barbarab

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 12:06:03