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

如何用MetPy结合Xarray Dataset绘制直线横截面图?

问题

使用MetPy和xarray对xarray.Dataset中的变量绘制横截面图时,通过经纬度对定义的横截面在图中显示为曲线,希望生成直线横截面。

解析数据并创建横截面的代码:

# Parse the data as MetPy for cross-sectional analysis
data = data.metpy.parse_cf()

# Longitude-latitude pair for cross-section analysis
start = (30.0, -90.0)
end = (60, 60.0)

# Create the cross-section
cross = cross_section(data, start, end).set_coords(('lat', 'lon'))

绘图代码:

# Preliminary plot
fig = plt.figure(1, figsize=(8, 6))
ax = plt.axes()

# Plot using contourf
sf_contour = ax.contourf(cross['lon'], cross['time'], cross['sf_ano'],
                         levels=np.arange(-3.4, 3.8, .4)*1e7, cmap='RdBu_r',
                         extend='both')
sf_colorbar = fig.colorbar(sf_contour)

# Adjust the y-axis
ax.set_ylim(cross['time'].max(), cross['time'].min())

解决方法

问题出在绘图时使用了lon作为x轴数据——横截面路径上的经度本身是随路径弯曲变化的,因此绘制出来的截面呈现曲线形态。MetPy的cross_section函数会自动生成一个沿横截面路径的距离坐标x(单位为公里),用这个坐标作为x轴就能得到直线横截面。

修改后的绘图代码如下:

# Preliminary plot
fig = plt.figure(1, figsize=(8, 6))
ax = plt.axes()

# 改用cross['x']作为x轴数据
sf_contour = ax.contourf(cross['x'], cross['time'], cross['sf_ano'],
                         levels=np.arange(-3.4, 3.8, .4)*1e7, cmap='RdBu_r',
                         extend='both')
sf_colorbar = fig.colorbar(sf_contour)

# Adjust the y-axis
ax.set_ylim(cross['time'].max(), cross['time'].min())
# 给x轴添加明确的距离标签
ax.set_xlabel('距离 (km)')

补充说明

  • cross['x']代表从横截面起点到当前点的直线距离,用它作为x轴,截面会以直线形式展示,完全符合直线横截面的需求。
  • 如果需要保留经纬度参考,可以在x轴刻度处额外标注对应位置的lon/lat值,或者在图中添加文本注释说明关键点位的经纬度。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 08:52:11