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

如何正确对齐matplotlib绘图的两个y轴?y_h=1与y=0.3错位怎么修复

matplotlib双y轴刻度对齐修复方案

你遇到的错位问题核心原因是左右两个y轴的数值范围比例不匹配、自动生成的刻度数量不一致,导致相同像素高度对应的两个轴的数值不相等。按你要求的左侧y=1 对应 右侧y=0.3的需求,直接修改如下即可:

完整可运行修改代码

import numpy as np
import matplotlib.pyplot as plt

x = 2
y = np.array([0.3, 0.11, 0.43])
y_h = np.array([1, 2, 3])

fig, host = plt.subplots(figsize=(8, 5))
fig.subplots_adjust(right=0.75)

colormap = plt.get_cmap("gist_rainbow")
colors = [colormap(i) for i in np.linspace(0, 1, y.size)]

line = host.twinx()

# 核心修改1:按对齐要求设置两个轴的数值范围,保证比例一致
# 左侧y=1 对应 右侧y=0.3,所以缩放比例为 0.3/1 = 0.3
left_ymin, left_ymax = 0, y_h.max() # 左侧范围0到3
right_ymin, right_ymax = 0, left_ymax * 0.3 # 右侧范围按比例设为0到0.9,刚好1对应0.3

host.set_ylim(left_ymin, left_ymax)
line.set_ylim(right_ymin, right_ymax)

# 核心修改2:强制两个轴的刻度数量一致,避免自动生成的刻度错位
host.set_yticks(np.linspace(left_ymin, left_ymax, 4)) # 左侧刻度:0,1,2,3
line.set_yticks(np.linspace(right_ymin, right_ymax, 4)) # 右侧刻度:0,0.3,0.6,0.9,和左侧一一对应

# 绘图逻辑调整:将左侧y值按比例转成右侧轴的对应数值,保证端点位置正确
for i in range(y.size):
    left_point_y = y_h[i] * 0.3
    p = line.plot([0, x], [left_point_y, y[i]], color=colors[i], label="p"+str(i))

host.set_xlim(0, x) 
host.set_xlabel("Rev_Count")
host.set_ylabel("Value")
line.set_ylabel('Value_Header')

plt.show()

其他场景适配

如果你不需要固定1对应0.3,而是希望左侧最大值和右侧最大值对齐,只需要把缩放比例改成:

scale = y.max() / y_h.max()
right_ymax = left_ymax * scale

如果需要显示自定义的右侧刻度(比如显示你原始的y值),直接修改line.set_yticks()的参数为你需要的数值列表即可。

内容的提问来源于stack exchange,提问作者KemerDev-C

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 06:06:03