实际上skyborn集成了一个模仿ncl泊松插值的代码库叫gridfill,下面给一个应用场景。
本代码示例演示850 hPa温度场的GridFill插值填补技术及其可视化分析。主要针对WRF模式输出中可能存在的缺测值或数据不连续问题,通过先进的网格填补算法进行数据修复,这样在计算一些方程时便不会因为缺测而数值爆炸。
pip install skyborn -i https://pypi.mirrors.ustc.edu.cn/simple/
Looking in indexes: https://pypi.mirrors.ustc.edu.cn/simple/
Collecting skyborn
Downloading https://mirrors.ustc.edu.cn/pypi/packages/8c/65/e7bacaa1f78840b77e41709b65426fc308f80a1bdf2b32ee91ad6989af5f/skyborn-0.3.14-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (1.9 MB)
[2K [90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━[0m [32m1.9/1.9 MB[0m [31m9.9 MB/s[0m eta [36m0:00:00[0ma [36m0:00:01[0m
[?25hRequirement already satisfied: dask in /opt/conda/lib/python3.9/site-packages (from skyborn) (2024.2.0)
Requirement already satisfied: matplotlib in /opt/conda/lib/python3.9/site-packages (from skyborn) (3.8.3)
Requirement already satisfied: cartopy in /opt/conda/lib/python3.9/site-packages (from skyborn) (0.23.0)
Requirement already satisfied: statsmodels in /opt/conda/lib/python3.9/site-packages (from skyborn) (0.13.2)
Requirement already satisfied: xarray in /opt/conda/lib/python3.9/site-packages (from skyborn) (2024.2.0)
Requirement already satisfied: eccodes in /opt/conda/lib/python3.9/site-packages (from skyborn) (1.7.0)
Requirement already satisfied: numpy in /opt/conda/lib/python3.9/site-packages (from skyborn) (1.26.4)
Requirement already satisfied: scipy in /opt/conda/lib/python3.9/site-packages (from skyborn) (1.11.4)
Requirement already satisfied: scikit-learn in /opt/conda/lib/python3.9/site-packages (from skyborn) (0.24.2)
Requirement already satisfied: netCDF4 in /opt/conda/lib/python3.9/site-packages (from skyborn) (1.6.5)
Requirement already satisfied: tqdm in /opt/conda/lib/python3.9/site-packages (from skyborn) (4.66.2)
Requirement already satisfied: cfgrib in /opt/conda/lib/python3.9/site-packages (from skyborn) (0.9.10.4)
Requirement already satisfied: seaborn in /opt/conda/lib/python3.9/site-packages (from skyborn) (0.11.2)
Requirement already satisfied: metpy in /opt/conda/lib/python3.9/site-packages (from skyborn) (1.6.1)
Requirement already satisfied: pyshp>=2.3 in /opt/conda/lib/python3.9/site-packages (from cartopy->skyborn) (2.3.1)
Requirement already satisfied: shapely>=1.7 in /opt/conda/lib/python3.9/site-packages (from cartopy->skyborn) (1.8.5.post1)
Requirement already satisfied: pyproj>=3.3.1 in /opt/conda/lib/python3.9/site-packages (from cartopy->skyborn) (3.4.1)
Requirement already satisfied: packaging>=20 in /opt/conda/lib/python3.9/site-packages (from cartopy->skyborn) (23.2)
Requirement already satisfied: contourpy>=1.0.1 in /opt/conda/lib/python3.9/site-packages (from matplotlib->skyborn) (1.2.0)
Requirement already satisfied: pillow>=8 in /opt/conda/lib/python3.9/site-packages (from matplotlib->skyborn) (9.4.0)
Requirement already satisfied: kiwisolver>=1.3.1 in /opt/conda/lib/python3.9/site-packages (from matplotlib->skyborn) (1.4.2)
Requirement already satisfied: importlib-resources>=3.2.0 in /opt/conda/lib/python3.9/site-packages (from matplotlib->skyborn) (5.7.1)
Requirement already satisfied: pyparsing>=2.3.1 in /opt/conda/lib/python3.9/site-packages (from matplotlib->skyborn) (3.0.9)
Requirement already satisfied: cycler>=0.10 in /opt/conda/lib/python3.9/site-packages (from matplotlib->skyborn) (0.11.0)
Requirement already satisfied: fonttools>=4.22.0 in /opt/conda/lib/python3.9/site-packages (from matplotlib->skyborn) (4.33.3)
Requirement already satisfied: python-dateutil>=2.7 in /opt/conda/lib/python3.9/site-packages (from matplotlib->skyborn) (2.8.2)
Requirement already satisfied: click in /opt/conda/lib/python3.9/site-packages (from cfgrib->skyborn) (8.1.3)
Requirement already satisfied: attrs>=19.2 in /opt/conda/lib/python3.9/site-packages (from cfgrib->skyborn) (21.4.0)
Requirement already satisfied: cffi in /opt/conda/lib/python3.9/site-packages (from eccodes->skyborn) (1.15.0)
Requirement already satisfied: findlibs in /opt/conda/lib/python3.9/site-packages (from eccodes->skyborn) (0.0.5)
Requirement already satisfied: toolz>=0.10.0 in /opt/conda/lib/python3.9/site-packages (from dask->skyborn) (0.12.1)
Requirement already satisfied: cloudpickle>=1.5.0 in /opt/conda/lib/python3.9/site-packages (from dask->skyborn) (2.0.0)
Requirement already satisfied: importlib-metadata>=4.13.0 in /opt/conda/lib/python3.9/site-packages (from dask->skyborn) (7.0.1)
Requirement already satisfied: partd>=1.2.0 in /opt/conda/lib/python3.9/site-packages (from dask->skyborn) (1.2.0)
Requirement already satisfied: fsspec>=2021.09.0 in /opt/conda/lib/python3.9/site-packages (from dask->skyborn) (2022.3.0)
Requirement already satisfied: pyyaml>=5.3.1 in /opt/conda/lib/python3.9/site-packages (from dask->skyborn) (5.4.1)
Requirement already satisfied: traitlets>=5.0.5 in /opt/conda/lib/python3.9/site-packages (from metpy->skyborn) (5.2.0)
Requirement already satisfied: pooch>=1.2.0 in /opt/conda/lib/python3.9/site-packages (from metpy->skyborn) (1.8.1)
Requirement already satisfied: pint>=0.17 in /opt/conda/lib/python3.9/site-packages (from metpy->skyborn) (0.23)
Requirement already satisfied: pandas>=1.4.0 in /opt/conda/lib/python3.9/site-packages (from metpy->skyborn) (2.0.3)
Requirement already satisfied: certifi in /opt/conda/lib/python3.9/site-packages (from netCDF4->skyborn) (2024.2.2)
Requirement already satisfied: cftime in /opt/conda/lib/python3.9/site-packages (from netCDF4->skyborn) (1.6.3)
Requirement already satisfied: joblib>=0.11 in /opt/conda/lib/python3.9/site-packages (from scikit-learn->skyborn) (1.3.2)
Requirement already satisfied: threadpoolctl>=2.0.0 in /opt/conda/lib/python3.9/site-packages (from scikit-learn->skyborn) (3.1.0)
Requirement already satisfied: patsy>=0.5.2 in /opt/conda/lib/python3.9/site-packages (from statsmodels->skyborn) (0.5.2)
Requirement already satisfied: zipp>=0.5 in /opt/conda/lib/python3.9/site-packages (from importlib-metadata>=4.13.0->dask->skyborn) (3.8.0)
Requirement already satisfied: pytz>=2020.1 in /opt/conda/lib/python3.9/site-packages (from pandas>=1.4.0->metpy->skyborn) (2022.1)
Requirement already satisfied: tzdata>=2022.1 in /opt/conda/lib/python3.9/site-packages (from pandas>=1.4.0->metpy->skyborn) (2024.1)
Requirement already satisfied: locket in /opt/conda/lib/python3.9/site-packages (from partd>=1.2.0->dask->skyborn) (1.0.0)
Requirement already satisfied: six in /opt/conda/lib/python3.9/site-packages (from patsy>=0.5.2->statsmodels->skyborn) (1.16.0)
Requirement already satisfied: typing-extensions in /opt/conda/lib/python3.9/site-packages (from pint>=0.17->metpy->skyborn) (4.7.1)
Requirement already satisfied: requests>=2.19.0 in /opt/conda/lib/python3.9/site-packages (from pooch>=1.2.0->metpy->skyborn) (2.27.1)
Requirement already satisfied: platformdirs>=2.5.0 in /opt/conda/lib/python3.9/site-packages (from pooch>=1.2.0->metpy->skyborn) (4.2.0)
Requirement already satisfied: pycparser in /opt/conda/lib/python3.9/site-packages (from cffi->eccodes->skyborn) (2.21)
Requirement already satisfied: charset-normalizer~=2.0.0 in /opt/conda/lib/python3.9/site-packages (from requests>=2.19.0->pooch>=1.2.0->metpy->skyborn) (2.0.12)
Requirement already satisfied: idna<4,>=2.5 in /opt/conda/lib/python3.9/site-packages (from requests>=2.19.0->pooch>=1.2.0->metpy->skyborn) (3.3)
Requirement already satisfied: urllib3<1.27,>=1.21.1 in /opt/conda/lib/python3.9/site-packages (from requests>=2.19.0->pooch>=1.2.0->metpy->skyborn) (1.26.9)
Installing collected packages: skyborn
Successfully installed skyborn-0.3.14
import numpy as np
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
import cartopy.feature as cfeature
from cartopy.util import add_cyclic_point
from netCDF4 import Dataset
from wrf import getvar, interplevel, latlon_coords, get_cartopy
from skyborn.gridfill.xarray import fill as xr_fill
import xarray as xr
# 路径替换成你的 wrfout 文件
wrf_file = Dataset('/home/mw/input/typhoon9537/wrfout_d01_2019-08-08_23_00_00')
# 提取变量
print("🌀 提取WRF变量中...")
lon = getvar(wrf_file, 'lon')
lat = getvar(wrf_file, 'lat')
p = getvar(wrf_file, 'pressure')
t = getvar(wrf_file, 'tc')
t850 = interplevel(t, p, 850)
t850.plot()
🌀 提取WRF变量中...
<matplotlib.collections.QuadMesh at 0x7f47525a58b0>

# GridFill 填补
temp_filled = xr_fill(t850, x_dim='west_east',
y_dim='south_north',eps=1e-4, relax=0.6, itermax=300, initzonal=True)
temp_filled.plot()
🔧 开始 GridFill 填补...
/opt/conda/lib/python3.9/site-packages/skyborn/gridfill/xarray.py:403: UserWarning: gridfill did not converge on 1 out of 1 slices. Consider increasing itermax or relaxing eps tolerance.
warnings.warn(
<matplotlib.collections.QuadMesh at 0x7f4741442550>

import matplotlib.pyplot as plt
import numpy as np
import matplotlib as mpl
from matplotlib import ticker
import cartopy.crs as ccrs
import cartopy.feature as cfeature
# 设置论文级别的绘图参数
plt.rcParams.update({
'font.family': 'serif',
'font.serif': ['Times New Roman', 'DejaVu Serif'],
'font.size': 12,
'axes.labelsize': 14,
'axes.titlesize': 16,
'xtick.labelsize': 12,
'ytick.labelsize': 12,
'legend.fontsize': 12,
'figure.dpi': 300,
'savefig.dpi': 600,
'savefig.bbox': 'tight',
'savefig.pad_inches': 0.1,
'figure.constrained_layout.use': True
})
# 创建填补前后的对比图
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(16, 8),
subplot_kw={'projection': ccrs.PlateCarree()})
# 颜色映射和等级设置
temp_levels = np.linspace(10, 30, 21)
diff_levels = np.linspace(-1.5, 1.5, 21)
cmap_temp = 'RdBu_r'
cmap_diff = 'coolwarm'
# 第一幅图:原始温度场
im1 = ax1.contourf(lon.values, lat.values, t850.values,
levels=temp_levels, cmap=cmap_temp, extend='both')
ax1.coastlines(linewidth=0.8, color='black')
ax1.add_feature(cfeature.BORDERS, linewidth=0.5, edgecolor='gray')
ax1.set_title('(a) Original 850 hPa Temperature Field', fontsize=16, pad=20, fontweight='bold')
ax1.set_xlabel('Longitude (°E)', fontsize=14, labelpad=10)
ax1.set_ylabel('Latitude (°N)', fontsize=14, labelpad=10)
# 添加经纬度网格
gl1 = ax1.gridlines(crs=ccrs.PlateCarree(), draw_labels=True,
linewidth=0.5, color='gray', alpha=0.7, linestyle='--')
gl1.top_labels = False
gl1.right_labels = False
gl1.xlabel_style = {'size': 10}
gl1.ylabel_style = {'size': 10}
# 第二幅图:填补后的温度场
im2 = ax2.contourf(lon.values, lat.values, temp_filled.values,
levels=temp_levels, cmap=cmap_temp, extend='both')
ax2.coastlines(linewidth=0.8, color='black')
ax2.add_feature(cfeature.BORDERS, linewidth=0.5, edgecolor='gray')
ax2.set_title('(b) GridFill Interpolated 850 hPa Temperature Field',
fontsize=16, pad=20, fontweight='bold')
ax2.set_xlabel('Longitude (°E)', fontsize=14, labelpad=10)
ax2.set_ylabel('Latitude (°N)', fontsize=14, labelpad=10)
gl2 = ax2.gridlines(crs=ccrs.PlateCarree(), draw_labels=True,
linewidth=0.5, color='gray', alpha=0.7, linestyle='--')
gl2.top_labels = False
gl2.right_labels = False
gl2.xlabel_style = {'size': 10}
gl2.ylabel_style = {'size': 10}
# 添加颜色条
cbar_ax = fig.add_axes([0.15, 0.05, 0.7, 0.02]) # 将y位置从0.08改为0.05,高度从0.03改为0.02
cbar = fig.colorbar(im1, cax=cbar_ax, orientation='horizontal',
label='Temperature (°C)', extend='both')
cbar.ax.tick_params(labelsize=12)
cbar.set_label('Temperature (°C)', fontsize=14, labelpad=10)
plt.show()

看着还挺像回事的。希望本文对你们有所帮助。