如何对齐主次Y轴刻度并调整次Y轴TVD_SCS刻度频率?
解决Matplotlib双Y轴(DEPTH与TVD_SCS_interp)精准对齐问题
核心思路
要实现次Y轴(TVD_SCS_interp)与主Y轴(DEPTH)刻度精准对齐,关键是复用主Y轴的刻度位置,通过插值计算每个DEPTH刻度对应的TVD值,直接替换次Y轴的刻度标签,而非给次Y轴单独设置刻度规则。
完整实现代码
import matplotlib.pyplot as plt import matplotlib.ticker as ticker import pandas as pd from scipy.interpolate import interp1d # 示例数据 data = { 'DEPTH': [100, 120, 140, 160, 180, 200, 220, 240], 'TVD_SCS_interp': [50.5, 60.2, 70.3, 80.7, 90.2, 100, 100.15, 120.9], 'Gamma_ray': [150, 150, 120, 130, 140, 130, 110, 100] } df = pd.DataFrame(data) # 建立DEPTH到TVD_SCS_interp的插值函数(处理非连续DEPTH的情况) depth_to_tvd = interp1d(df['DEPTH'], df['TVD_SCS_interp'], kind='linear', fill_value="extrapolate") # 创建绘图对象 fig, ax1 = plt.subplots(figsize=(8, 10)) ax2 = ax1.twinx() # 绘制Gamma_ray vs DEPTH曲线 ax1.plot(df['Gamma_ray'], df['DEPTH'], color="#00be00", label='Gamma Ray') # 设置主Y轴(DEPTH)的范围和刻度 top_depth = df['DEPTH'].max() bottom_depth = df['DEPTH'].min() ax1.set_ylim(top_depth, bottom_depth) # 钻井数据通常深度从上到下递增,反转Y轴 ax1.yaxis.set_major_locator(ticker.MultipleLocator(10)) # 主刻度间隔10 ax1.yaxis.set_minor_locator(ticker.MultipleLocator(1)) # 次刻度间隔1 ax1.set_ylabel('DEPTH') ax1.set_xlabel('Gamma Ray') # 配置次Y轴(TVD_SCS_interp) # 复用主Y轴的刻度位置,计算对应TVD值 ax1_ticks = ax1.get_yticks() tvd_ticks = depth_to_tvd(ax1_ticks) # 设置次Y轴的刻度位置与主Y轴一致,替换为TVD值作为标签 ax2.set_yticks(ax1_ticks) ax2.set_yticklabels([f'{tvd:.2f}' for tvd in tvd_ticks]) # 同步次Y轴范围与主Y轴(通过插值映射) ax2.set_ylim(top_depth, bottom_depth) ax2.set_ylabel('TVD_SCS_interp') # 添加图例 fig.legend(loc='upper right') plt.tight_layout() plt.show()
关键步骤说明
- 插值函数构建:原始DEPTH数据非10间隔连续,用
scipy.interpolate.interp1d构建线性插值函数,确保任意DEPTH值都能匹配对应的TVD_SCS_interp值。 - 主Y轴刻度控制:通过
MultipleLocator(10)设置DEPTH轴的主刻度间隔为10,满足刻度频率要求。 - 次Y轴刻度复用:直接复用主Y轴的刻度位置,避免次Y轴自动生成错位刻度,保证位置完全对齐。
- 标签替换:用插值函数计算每个主刻度位置对应的TVD值,替换次Y轴的刻度标签,实现数值与主轴位置精准对应。
内容的提问来源于stack exchange,提问作者Mahammad Ojagzada
相关产品推荐
相关产品推荐

