如何绘制无偏移双Y轴图表?使用twinx()出现偏移求解决
解决双Y轴绘图偏移问题
问题原因
你遇到的视觉偏移,本质是两组数据(LSD和NAVD88)的数值范围不同,twinx()生成的第二个Y轴会自动根据自身数据范围计算刻度,导致两条线因Y轴缩放比例不一致,出现错位。实际上两组数据的X轴(时间戳)是完全对齐的。
解决方案
由于NAVD88与LSD通常是线性相关的(NAVD88 = LSD + 固定基准偏移量),我们可以手动对齐两个Y轴的刻度范围,让两条线完全重合:
修改后的完整代码
dbc = r'Database Connection' QueryTable = "QueryTable" sql= "Identifier="+NWFID # Setup arrays x = [] y = [] y1 = [] fields = ["datetime", "WL_LSD", "WL_Altitude_NAVD88"] with arcpy.da.SearchCursor(dbc, fields, where_clause = sql, sql_clause=(None, 'ORDER BY "datetime"')) as rows: for row in rows: x.append(row[0]) y.append(row[1]) y1.append(row[2]) fig, ax1 = plt.subplots() ax1.set_xlabel('Date') ax1.set_ylabel('LSD', color = 'red') plot_1 = ax1.plot(x, y, color = 'red', label='GWL (LSD)') ax1.tick_params(axis ='y', labelcolor = 'red') # 计算两组数据的固定偏移量(取第一组数据的差值作为基准) offset = y1[0] - y[0] ax2 = ax1.twinx() ax2.set_ylabel('Altitude', color = 'blue') plot_2 = ax2.plot(x, y1, color = 'blue', label = 'GWL (NAVD88)') # 修正了标签的引号缺失问题 ax2.tick_params(axis ='y', labelcolor = 'blue') # 同步两个Y轴的刻度范围 y_min, y_max = ax1.get_ylim() ax2.set_ylim(y_min + offset, y_max + offset) lns = plot_1 + plot_2 labels = [l.get_label() for l in lns] plt.legend(lns, labels, loc=0) plt.show()
关键操作说明
- 计算固定偏移量:假设NAVD88与LSD的差值恒定,取第一组数据的差值作为基准偏移量
offset,确保两个刻度体系的对应关系。 - 同步Y轴范围:获取ax1的Y轴上下限,给每个值加上偏移量后设置为ax2的Y轴上下限,让两个Y轴的刻度一一对应,线条自然重合。
- 细节修正:原代码中
label = 'GWL (NAVD88'存在引号缺失问题,已在修改后的代码中补全。
如果偏移量存在微小波动(如测量误差),也可以直接将LSD数据加上偏移量后用ax2绘制,同样能保证线条视觉上重合。
内容的提问来源于stack exchange,提问作者Mr. Geologist
相关产品推荐
相关产品推荐

