如何使用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
相关产品推荐
相关产品推荐

