Matplotlib使用secondary_yaxis添加次Y轴时如何对齐水平网格线
要实现主次Y轴刻度和水平网格线完全对齐,只需强制次Y轴的刻度由主Y轴刻度按你定义的换算规则转换而来即可,修改后的代码如下:
import numpy as np import matplotlib.pyplot as plt x, y = np.random.random((2,50)) fig, ax = plt.subplots() ax.scatter(x, y*10, s=50, cmap='viridis') ax.set_xlabel('X1_z') ax.set_ylabel('x1_y') ax.set_title('Adding secondary y-axis') def a2b(y): return y/2.5 def b2a(y): return 2.5*y secax = ax.secondary_yaxis('right', functions=(a2b,b2a)) secax.set_ylabel('x2_y') # 新增以下两行实现刻度对齐 main_yticks = ax.get_yticks() secax.set_yticks(a2b(main_yticks)) plt.show()
默认情况下matplotlib会为次Y轴独立生成最优刻度,没有和主Y轴的刻度逻辑绑定,所以会出现错位。手动读取主Y轴当前的刻度值,用你定义的a2b换算成次Y轴对应值后,直接设置为次Y轴的刻度,就能保证两个轴的刻度点完全对应同一水平网格线,同时也能直观展示两个轴的换算比例。
如果有动态调整主Y轴范围的需求,可以将上述两行刻度设置的逻辑绑定到Y轴范围变化的事件回调中,即可实现动态对齐。
内容的提问来源于stack exchange,提问作者rpb
相关产品推荐
相关产品推荐

