You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何绘制无偏移双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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 11:23:22