如何使用xarray仅沿指定红线插值外推气温数据?
问题:如何用xarray仅沿指定红线对气温进行插值与外推
我希望使用xarray沿图中红线对气温值进行插值和外推。参考了xarray官方文档的高级插值示例,但当前代码似乎在对整个区域进行插值,我只需要针对红线处理。如何将插值范围限定为仅红线?
原代码:
ds = xr.tutorial.open_dataset("air_temperature") ds_mean = ds.air.mean(dim='time') def line(x,A): return x, A*x x, y = line(np.linspace(ds_mean.lon[0], ds_mean.lon[-1], 30), 0.1) dsi = ds_mean.interp(lon=x, lat=y, kwargs={"fill_value":"extrapolate"}) fig, axes = plt.subplots(ncols=2, figsize=(10, 4)) ds_mean.plot(ax=axes[0],zorder=0, alpha=0.4) axes[0].plot(x,y,'o',zorder=10) axes[0].set_title("Mean Air") dsi.plot(ax=axes[1]) axes[1].set_title("Mean air along one line")
问题分析
你当前用interp(lon=x, lat=y)的写法,会让x和y两个一维数组自动广播成二维网格,最终生成的dsi是一个二维数据集,所以绘图时会显示整个区域的插值结果,而非仅红线上的点。
解决方案
要限定仅对红线上的点进行插值/外推,需要把经度和纬度配对成离散点序列,而非让它们形成网格。可以通过interp的points参数来指定这些点:
import xarray as xr import numpy as np import matplotlib.pyplot as plt ds = xr.tutorial.open_dataset("air_temperature") ds_mean = ds.air.mean(dim='time') def line(x,A): return x, A*x # 生成红线上的坐标点对 lon_points, lat_points = line(np.linspace(ds_mean.lon[0], ds_mean.lon[-1], 30), 0.1) # 将坐标点包装为DataArray,指定坐标维度 points = xr.DataArray( np.column_stack((lon_points, lat_points)), dims=["points", "coord"], coords={"coord": ["lon", "lat"]} ) # 仅对指定点序列执行插值与外推 dsi = ds_mean.interp(points=points, kwargs={"fill_value":"extrapolate"}) fig, axes = plt.subplots(ncols=2, figsize=(10, 4)) # 左图:原始数据+红线点 ds_mean.plot(ax=axes[0], zorder=0, alpha=0.4) axes[0].plot(lon_points, lat_points, 'ro', zorder=10) axes[0].set_title("平均气温") # 右图:红线上的插值结果(用折线+散点展示) axes[1].plot(lon_points, dsi.values, 'b-', marker='o') axes[1].set_xlabel("经度") axes[1].set_ylabel("气温") axes[1].set_title("红线上的平均气温(插值+外推)") plt.tight_layout() plt.show()
关键修改说明
- 用
np.column_stack把经度和纬度一一配对,避免生成二维网格 - 通过
xr.DataArray包装点序列,让xarray明确识别每个点的经度、纬度信息 - 插值后的
dsi是一维数组,对应红线上每个点的气温值,直接用折线/散点图展示即可,无需再用二维热力图
内容的提问来源于stack exchange,提问作者JCV
相关产品推荐
相关产品推荐

