我有一个包含全球海面温度的netcdf文件。使用matplotlib和Basemap,我已经成功地使用以下代码为这些数据创建了一个Map:
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)
问题是数据的分辨率非常高(9 km网格),这使得生成的图像非常嘈杂。我想把数据放到分辨率较低的网格上(例如:g.1度),但我正在努力研究如何做到这一点。我遵循一个可行的解决方案,通过将下面的代码插入到我上面的示例中来尝试使用matplotlib griddata函数,但它导致了'ValueError:条件必须是一维数组'。
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)
我是Python和matplotlib的初学者,所以我不确定我做错了什么(或者更好的方法可能是什么)。任何建议赞赏!
5条答案
按热度按时间f0brbegy1#
如果你使用e.例如双线性插值,这将导致更平滑场。
NCAR ClimateData指南有一个很好的introduction to regridding(通用,而不是Python特定的)。
据我所知,Python可用的最强大的regridding例程实现是Earth System Modeling Framework (ESMF) Python interface (ESMPy)。如果这对您的应用程序来说有点太复杂,您应该查看
1.将数据转换为Iris立方体并使用Iris的重新网格化函数。
也许可以先看看EarthPy regridding tutorial using Basemap,因为您已经在使用它了。
在您的示例中执行此操作的方法是
这将对SST数据执行双线性插值(
order=1
),并将其插入到子采样网格(每隔四个点)。之后,您的图看起来会更加粗粒度。如果你不喜欢,用e插值回到原始网格上。g的。rqdpfwrv2#
我通常通过拉普拉斯滤波器来平滑我的数据。也许你可以试试下面的函数,看看它是否对你的数据有帮助。该函数可以在有或没有掩码的情况下调用(例如:g海洋数据点的陆地/海洋掩模)。希望这能帮上忙。T形
q3aa05253#
关于
scipy.interpolate.griddata
的原始问题:仔细查看该函数的参数规格(e。例如,在SciPy documentation中),并确保您的输入数组具有正确的形状。你可能需要做一些事情,比如
等等
rkue9o1l4#
如果您使用的是Linux,则可以使用nctoolkit(https://nctoolkit.readthedocs.io/en/latest/)来实现这一点。
你没有说明你的数据的latlon范围,所以我假设它是一个全局数据集。重新网格化到1度分辨率需要以下内容:
3ks5zfa05#
看看这个使用xarray的例子。..使用
ds.interp
方法并指定新的纬度和经度值。http://xarray.pydata.org/en/stable/interpolation.html#example