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

如何为twinx生成的双Y轴设置指定偏移量?

实现双Y轴指定偏移对齐(ax1的y=y0与ax2的y=0对齐)

要实现你需要的效果——在twinx()创建的独立双Y轴基础上,让ax1的指定y值y0与ax2的y=0对齐,同时保留两个轴自主缩放的能力,可以通过坐标转换+事件回调的方式实现,具体代码和说明如下:

核心思路

  1. 用twinx()创建共享X轴的双Y轴,保持两个轴的独立性;
  2. 通过坐标转换,计算ax1中y=y0对应的像素位置,再将ax2的y=0调整到该位置;
  3. 绑定轴范围变化的事件回调,确保每次缩放后都能重新对齐指定位置。

完整代码示例

import matplotlib.pyplot as plt

# 示例数据
x1 = range(10)
y1 = [i + 3 for i in x1]  # ax1数据,y0=5在该数据范围内
x2 = range(10)
y2 = [i*2 - 5 for i in x2]

y0 = 5  # 需要与ax2的y=0对齐的ax1的y值

# 创建双Y轴
fig, ax1 = plt.subplots()
ax2 = ax1.twinx()

# 绘制数据
ax1.plot(x1, y1, 'b-', label='轴1数据')
ax2.plot(x2, y2, 'r-', label='轴2数据')

def align_y_axes(ax1, ax2, target_y):
    # 将ax1的target_y转换为像素坐标
    target_pixel = ax1.transData.transform((0, target_y))[1]
    # 将像素坐标转换为ax2的数据坐标
    ax2_target = ax2.transData.inverted().transform((0, target_pixel))[1]
    # 调整ax2的Y轴范围,让y=0对齐到目标位置
    y2_min, y2_max = ax2.get_ylim()
    ax2.set_ylim(y2_min - ax2_target, y2_max - ax2_target)

# 初始对齐
align_y_axes(ax1, ax2, y0)

# 绑定事件回调,每次轴范围变化时重新对齐
def on_axis_lims_change(event):
    align_y_axes(ax1, ax2, y0)

ax1.callbacks.connect('ylim_changed', on_axis_lims_change)
ax2.callbacks.connect('ylim_changed', on_axis_lims_change)
ax1.callbacks.connect('xlim_changed', on_axis_lims_change)

# 添加合并图例
lines1, labels1 = ax1.get_legend_handles_labels()
lines2, labels2 = ax2.get_legend_handles_labels()
ax1.legend(lines1 + lines2, labels1 + labels2, loc='upper left')

plt.show()

关键说明

  • 两个轴完全独立,各自会根据数据自动调整Y轴范围,只是强制保持ax1.y=y0与ax2.y=0的垂直对齐;
  • 事件回调会在X/Y轴缩放、窗口大小调整时自动触发,确保对齐关系始终生效;
  • 不同于你提到的关联主次Y轴的方案,此方法不需要将两个轴的数据用函数绑定,完全保留了twinx()的独立缩放特性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 05:12:48