【发布时间】:2023-03-26 21:03:01
【问题描述】:
我有一个包含全球海面温度的 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)
问题在于数据的分辨率非常高(9 公里网格),这使得生成的图像非常嘈杂。我想将数据放到较低分辨率的网格上(例如 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 的相对初学者,所以我不确定我做错了什么(或者可能有什么更好的方法)。任何建议表示赞赏!
【问题讨论】:
-
你有没有尝试使用
conturf,我发现它可以产生更平滑的图 -
嗨,是的,我也尝试过 contourf,但它并不能真正解决问题。对于高分辨率数据,轮廓之间的边界并不平滑。如果我可以先对数据进行平滑处理,然后进行轮廓处理就可以了,但我还没有找到一个好的方法。
-
如何将精确值传递给
contourf,在这些轮廓上必须绘制轮廓,间隔非常小,应该可以平滑地图上的数据。
标签: python numpy matplotlib matplotlib-basemap