如何在Matplotlib中创建与原Y轴成固定缩放比例的次Y轴
修正后完整代码
import numpy as np import matplotlib.pyplot as plt x, y = np.random.random((2, 50)) fig, ax1 = plt.subplots() # 绘制原始散点图 ax1.scatter(x, y * 10, c='b') ax1.set_xlabel('X1_z') ax1.set_ylabel('x1_y', color='g') # 定义双向缩放规则 def primary_to_secondary(y): return y / 2.5 def secondary_to_primary(y): return y * 2.5 # 直接生成缩放次Y轴,无需额外绘图 ax2 = ax1.secondary_yaxis('right', functions=(primary_to_secondary, secondary_to_primary)) ax2.set_ylabel('x2_y', color='r') plt.show()
问题对应解决说明
- 次Y轴缩放比例不符合预期:原代码仅使用
twinx()生成次轴,但没有绑定主次轴的数值映射关系,次轴会默认根据自身绘制的内容自动调整刻度,和主Y轴无关联。新方案使用secondary_yaxis的functions参数传入双向缩放规则,次轴刻度会严格按照y2=y1/2.5和主Y轴一一对应。 - 次Y轴生成多余的多条水平线:多余线条来自冗余的
ax2.plot(1, 1, 'w-')代码,虽然设置了白色不可见,但多次运行或画布缓存时会叠加生成多余线条,新方案无需在次轴上绘制任何内容,自然不会出现多余线条。 - 无需添加
ax2.plot(1, 1, 'w-')创建次轴:secondary_yaxis是Matplotlib专门用于生成映射型次轴的接口,仅通过数值规则就可以生成对应刻度,完全不需要在次轴上绘制占位图形,这行冗余代码可以直接删除。
内容的提问来源于stack exchange,提问作者rpb
相关产品推荐
相关产品推荐

