Matplotlib结合MetPy为SkewT图添加次Y轴时坐标范围异常问题
问题描述
我知晓该问题看似与大量同类问题相似,但我已尝试过现有公开方案,均无法解决在添加次Y轴过程中遇到的实际问题。
问题表现十分明确,未找到有效修复方法:在SkewT图上添加次Y轴时,会直接修改原有绘图的Y轴范围,而非仅新增独立坐标轴。
次Y轴实现需求
SkewT图默认Y轴使用气压层标识高度,需要同步展示以km为单位的海拔高度,次Y轴需满足以下规则:
- 坐标缩放范围与原Y轴完全一致,覆盖1015hPa到100hPa区间
- 次Y轴仅展示0、1、3、6、9、12、15km刻度(基于气压hPa到海拔km的标准转换关系)
- 0km刻度与原轴起始气压层对齐,按对应比例缩放
- 次Y轴同样采用Y轴对数缩放(log scaling)
异常表现
添加次Y轴后次轴缩放比例与原轴不匹配,效果如下:
已尝试的失效代码
仅运行第一行twinx()代码就会触发原有图形的Y轴范围变化:
twin = skew.ax.twinx() twin.set_yscale('log') twin.spines['right'].set_position(('axes', 0)) twin.set_frame_on(True) twin.patch.set_visible(False) twin.set_ylim(skew.ax.get_ylim())
最小复现代码
基于MetPy官方提供的Simple Sounding示例代码,整理了可直接运行的最小复现样例:
import matplotlib.pyplot as plt import pandas as pd import metpy.calc as mpcalc from metpy.cbook import get_test_data from metpy.plots import SkewT from metpy.units import units plt.rcParams['figure.figsize'] = (9, 9) col_names = ['pressure', 'height', 'temperature', 'dewpoint', 'direction', 'speed'] df = pd.read_fwf(get_test_data('jan20_sounding.txt', as_file_obj=False), skiprows=5, usecols=[0, 1, 2, 3, 6, 7], names=col_names) # 丢弃温度、露点、风向、风速字段全为NaN的行 df = df.dropna(subset=('temperature', 'dewpoint', 'direction', 'speed' ), how='all').reset_index(drop=True) p = df['pressure'].values * units.hPa T = df['temperature'].values * units.degC Td = df['dewpoint'].values * units.degC wind_speed = df['speed'].values * units.knots wind_dir = df['direction'].values * units.degrees u, v = mpcalc.wind_components(wind_speed, wind_dir) skew = SkewT() # 按照气象绘图常规规范,使用Y轴对数缩放绘制数据 skew.plot(p, T, 'r') skew.plot(p, Td, 'g') skew.plot_barbs(p, u, v) # 绘制各类特征参考线 skew.plot_dry_adiabats() skew.plot_moist_adiabats() skew.plot_mixing_lines() skew.ax.set_ylim(1000, 100) # 以下为失效的次轴添加代码,注释后可生成正常基础图 # twin = skew.ax.twinx() # twin.set_yscale('log') # twin.spines['right'].set_position(('axes', 0)) # twin.set_frame_on(True) # twin.patch.set_visible(False) # twin.set_ylim(skew.ax.get_ylim()) plt.savefig("metpy_base.png")
问题推测与诉求
推测该问题可能是代码编写疏漏,或是MetPy本身的特殊机制导致twinx()等方法无法达到预期效果。需要的可行方案为:新增的次Y轴与原Y轴的气压值、缩放比例完全一致,仅需自定义指定刻度位置,将刻度标签替换为对应的海拔km数值即可。
内容的提问来源于stack exchange,提问作者PhilippeTh
相关产品推荐
相关产品推荐

