使用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
相关产品推荐
相关产品推荐

