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).如果您的应用程序有点过于牵连,那么您应该深入研究
也许可以先看一下使用Basemap的EarthPy 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)
| 归档时间: |
|
| 查看次数: |
8666 次 |
| 最近记录: |