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

