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

如何使用Matplotlib绘制无数学关联双Y轴的温度-高度/气压曲线

问题描述

我有一个文本文件,每行存储pressure(气压)、height(高度)、*temperature(温度)*三类数据,需要绘制温度变化曲线,同时用两个Y轴分别对应高度和气压,但我遇到了双Y轴无法同步的问题。该问题看似和两篇Stack Overflow提问相似,但核心差异是本次场景中的两个Y轴参数不存在任何数学关联。

第一次尝试方案及问题

我首先尝试使用twinx()方法分别绘制温度随高度变化的蓝色曲线、温度随气压变化的红色曲线,再隐藏其中一条曲线,代码如下:

import matplotlib.pyplot as plt
import pandas as pd
from metpy.cbook import get_test_data


# 读取MetPy示例数据中的高空探测数据
col_names = ['pressure', 'height', 'temperature']

df = pd.read_fwf(get_test_data('jan20_sounding.txt', as_file_obj=False),
                 skiprows=5, usecols=[0, 1, 2], names=col_names)

# 剔除温度列全为NaN的行
df = df.dropna(subset=['temperature'], how='all').reset_index(drop=True)

h = df['height'].values
p = df['pressure'].values
T = df['temperature'].values

# 绘图
fig, ax = plt.subplots()

ax.plot(T, h, color='blue')
ax.tick_params(axis='y', colors='blue')
ax2=ax.twinx()
ax2.plot(T, p, color='red')
ax2.tick_params(axis='y', colors='red')
plt.gca().invert_yaxis()

plt.show()

但运行结果如下图所示,由于两个Y轴不存在线性关系,两条曲线位置不匹配,Y轴刻度标签无法同步,例如气压值“800”的刻度应当与蓝色曲线的峰值处于同一水平高度:
第一次运行结果

第二次尝试方案及问题

第二次我给第二个对应气压的Y轴调用set_yticks设置刻度,代码如下:

import matplotlib.pyplot as plt
import pandas as pd
from metpy.cbook import get_test_data


# 读取MetPy示例数据中的高空探测数据
col_names = ['pressure', 'height', 'temperature']

df = pd.read_fwf(get_test_data('jan20_sounding.txt', as_file_obj=False),
                 skiprows=5, usecols=[0, 1, 2], names=col_names)

# 剔除温度列全为NaN的行
df = df.dropna(subset=['temperature'], how='all').reset_index(drop=True)

h = df['height'].values
p = df['pressure'].values
T = df['temperature'].values

# pp=[p[i] for i in range(0, len(p), 10)]

# 绘图
fig, ax = plt.subplots()

ax.plot(T, h, color='blue')
ax.tick_params(axis='y', colors='blue')
ax2=ax.twinx()
ax2.set_yticks([p[i] for i in range(0, len(p), 10)])
ax2.tick_params(axis='y', colors='red')
plt.gca().invert_yaxis()

plt.show()

但输出结果仍不符合预期,气压刻度标签未与温度曲线位置对齐,例如“978”的标签应当对应曲线的起始点位置,结果如下图:
第二次运行结果

需求说明

如果仅需要显示[900, 800, 500, 300, 100]这几个预定义气压等级的标签,且要和高度轴的对应位置完全匹配,问题会更易处理,最终期望效果如下图:
期望效果

请问有什么可行的方案可以实现上述需求?


内容的提问来源于stack exchange,提问作者Amir

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 17:30:06