重新定期的netcdf数据

Nic*_*ckF 2 python numpy matplotlib matplotlib-basemap

我有一个包含全球海面温度的netcdf文件.使用matplotlib和Basemap,我已设法使用以下代码制作此数据的映射:

from netCDF4 import Dataset
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap

filename = '/Users/Nick/Desktop/SST/SST.nc'
fh = Dataset(filename, mode='r')

lons = fh.variables['LON'][:]
lats = fh.variables['LAT'][:]
sst = fh.variables['SST'][:].squeeze()

fig = plt.figure()

m = Basemap(projection='merc', llcrnrlon=80.,llcrnrlat=-25.,urcrnrlon=150.,urcrnrlat=25.,lon_0=115., lat_0=0., resolution='l')

lon, lat = np.meshgrid(lons, lats)
xi, yi = m(lon, lat)

cs = m.pcolormesh(xi,yi,sst, vmin=18, vmax=32)

m.drawmapboundary(fill_color='0.3')
m.fillcontinents(color='0.3', lake_color='0.3')
cbar = m.colorbar(cs, location='bottom', pad="10%", ticks=[18., 20., 22., 24., 26., 28., 30., 32.])
cbar.set_label('January SST (' + u'\u00b0' + 'C)')
plt.savefig('SST.png', dpi=300)
Run Code Online (Sandbox Code Playgroud)

问题是数据是非常高的分辨率(9km网格),这使得产生的图像非常嘈杂.我想将数据放到较低分辨率的网格(例如1度),但我正在努力弄清楚如何做到这一点.我按照一个有效的解决方案尝试使用matplotlib griddata函数,将下面的代码插入到上面的示例中,但结果是'ValueError:condition必须是一维数组'.

xi, yi = np.meshgrid(lons, lats)

X = np.arange(min(x), max(x), 1)
Y = np.arange(min(y), max(y), 1)

Xi, Yi = np.meshgrid(X, Y)

Z = griddata(xi, yi, z, Xi, Yi)
Run Code Online (Sandbox Code Playgroud)

我是Python和matplotlib的相对初学者,所以我不确定我做错了什么(或者更好的方法可能是什么).任何建议赞赏!

j08*_*lue 10

如果您REGRID例如使用双线性插值数据的粗糙纬度/经度网格,这将导致一个平滑的领域.

NCAR ClimateData指南对regridding有一个很好的介绍(一般,不是Python特定的).

据我所知,可用于Python的重组例程的最强大实现是地球系统建模框架(ESMF)Python接口(ESMPy).如果您的应用程序有点过于牵连,那么您应该深入研究

  1. 关于重新编译的EarthPy教程(例如使用Pyresample,cKDTreeBasemap).
  2. 将您的数据转换为Iris多维数据集并使用Iris的重新编译功能.

也许可以先看一下使用BasemapEarthPy regridding教程,因为你已经在使用它了.

在你的例子中这样做的方法是

from mpl_toolkits import basemap
from netCDF4 import Dataset

filename = '/Users/Nick/Desktop/SST/SST.nc'
with Dataset(filename, mode='r') as fh:
   lons = fh.variables['LON'][:]
   lats = fh.variables['LAT'][:]
   sst = fh.variables['SST'][:].squeeze()

lons_sub, lats_sub = np.meshgrid(lons[::4], lats[::4])

sst_coarse = basemap.interp(sst, lons, lats, lons_sub, lats_sub, order=1)
Run Code Online (Sandbox Code Playgroud)

order=1将对您的SST数据执行双线性插值()到子采样网格(每四个点).之后你的情节看起来会更粗糙.如果您不喜欢这样,请使用例如插回原始网格

sst_smooth = basemap.interp(sst_coarse, lons_sub[0,:], lats_sub[:,0], *np.meshgrid(lons, lats), order=1)
Run Code Online (Sandbox Code Playgroud)

  • 镇上的新孩子是[xESMF](https://github.com/JiaweiZhuang/xESMF) - 游戏改变者的ESMF界面[`xarray`](http://xarray.pydata.org/en/stable/) . (2认同)