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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 10:21:23