我想在绘制netcdf数据集的数据时屏蔽海洋。我遵循了in the answer to this question给出的伟大指示。它对世界上一半的人都很有效,但不知怎么的,格林威治以西的一切都被掩盖了,包括海洋和陆地。
这是我的代码:
import netCDF4
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
import matplotlib.cm as cm
import mpl_toolkits
from mpl_toolkits import basemap
from mpl_toolkits.basemap import Basemap, maskoceans
filename = 'myfile.nc'
vmin = 0.
vmax = 1
nc = netCDF4.Dataset(filename, 'r')
data = nc.variables['sum'][:]
lats_1d = nc.variables['lat'][:]
lons_1d = nc.variables['lon'][:]
lons, lats = np.meshgrid(lons_1d, lats_1d)
labels = ['DJF', 'MAM', 'JJA', 'SON']
cmap = cm.RdYlBu
cmap.set_over('#00FF00')
my_dpi = 96
fig = plt.figure(figsize=(1200/my_dpi, 800./my_dpi))
for season in range(4):
ax = fig.add_subplot(2, 2, season+1)
map1 = basemap.Basemap(resolution='c', projection='kav7', lon_0=0)
map1.drawcoastlines()
map1.drawcountries()
nc_new = maskoceans(lons,lats,data[season,:,:],resolution='c', grid = 1.25)
datapc = map1.pcolormesh(lons, lats, nc_new, vmin=vmin, vmax=vmax, cmap=cmap, latlon=True)
plt.title(labels[season])
fig.tight_layout(pad=1, w_pad=1, h_pad=4)
ax = fig.add_axes([0.05, 0.52, 0.9, 0.025])
cb = plt.colorbar(cax=ax, orientation='horizontal', cmap=cmap,
extend='max', format="%.2f",
ticks=[0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1])
plt.show()
我知道有一个类似的问题被提出,但从来没有得到回答,看来问题是把长坐标与X-Y坐标混合起来。我试着切换到x-y坐标,但得到了相同的半地图你知道这里会发生什么吗?
注意:当使用
datapc = map1.pcolormesh(lons, lats, data[season,:,:], vmin=vmin, vmax=vmax, cmap=cmap, latlon=True)
绘制未屏蔽数据时,将绘制整个世界(陆地+海洋)。 最佳答案
如您所确定的,没有绘制经度为-180到0的点假设它们在您的数据中,它们一定是由于某种原因被屏蔽或丢弃的。
我的直觉是数据集的经度是0-360,而不是-180到180,在confirmed中是comments。
快速解决方法是添加
lons_1d[lons_1d>180]-=360
就在你从
lons_1d
中取出nc
之后这是因为lons_1d
是一个NUMPY数组,它使用NUMPY boolean array indexing(通常称为“幻想”索引)来有条件地选择大于180的经度值,并从中减去360。正如您所注意到的,如果您省略了掩码,
pcolormesh
图就会工作,这看起来像是maskoceans
函数中的包装错误,或者至少是意外行为。作为参考-我不认为你是第一个遇到类似的“包装”类型的面具问题,我认为这个issue on the matplotlib github看起来相当相似。
关于python - 在 basemap 中使用maskoceans时被遮掩的世界一半,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36070153/