当在底图中使用maskoceans时,世界上一半的人被蒙蔽了

2024-04-19 10:27:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我想在绘制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()

Resulting image

我知道有人提出了一个有点类似的问题here,但一直没有得到答复,看来最后问题是把长坐标和x-y坐标混在一起。我试着切换到x-y坐标,但是得到了同样的半地图。你知道这里会发生什么吗?在

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


Tags: 数据importmatplotlibasfigpltmplseason
1条回答
网友
1楼 · 发布于 2024-04-19 10:27:59

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

我的直觉是数据集经度是0-360,而不是-180到180,这是comments中的confirmed。在

快速解决方法是添加

lons_1d[lons_1d>180]-=360

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

正如您所注意到的,如果省略掩码,pcolormesh图是有效的,这看起来像是{}函数中包装的错误,或者至少是意外的行为。在

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

相关问题 更多 >