在底图中使用 maskoceans 时,世界的一半被遮蔽

Cyn*_* GS 5 python plot netcdf matplotlib-basemap

我想在绘制 netCDF 数据集中的数据时掩盖海洋。我遵循了这个问题的答案中给出的重要指示。它对半个世界都有效,但不知何故,格林威治以西的一切也都被遮盖了,无论是海洋还是陆地。这是我的代码:

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()
Run Code Online (Sandbox Code Playgroud)

结果图像

我知道这里提出了一个有点类似的问题,但从未得到解答,看来最终问题是将经纬度坐标与 xy 坐标混合在一起。我尝试切换到 xy 坐标,但得到了相同的半图。知道这里会发生什么吗?

注意,datapc = map1.pcolormesh(lons, lats, data[season,:,:], vmin=vmin, vmax=vmax, cmap=cmap, latlon=True)当使用整个世界(陆地+海洋)绘制未屏蔽数据时。

J R*_*ape 4

正如您所确定的,经度为 -180 到 0 的点没有被绘制。假设它们在您的数据中,那么它们一定由于某种原因被屏蔽或丢弃。

我的直觉是数据集经度范围是 0-360,而不是 -180 到 180,这在评论中得到了证实

解决此问题的快速方法是添加

lons_1d[lons_1d>180]-=360
Run Code Online (Sandbox Code Playgroud)

就在你退出lons_1d之后nc。这是有效的,因为lons_1d是一个 numpy 数组,并且它使用 numpy布尔数组索引(通常称为“花式”索引)有条件地选择大于 180 的经度值并从中减去 360。

正如您注意到的,pcolormesh如果省略掩码,该图就会起作用,这看起来像是函数中的一个错误maskoceans,或者至少是意外的行为。

作为参考 - 我不认为您是第一个遇到类似的“包装”类型掩码问题的人,我认为matplotlib github 上的这个问题看起来非常相似。