如何正确对齐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
相关产品推荐
相关产品推荐

