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)当使用整个世界(陆地+海洋)绘制未屏蔽数据时。
正如您所确定的,经度为 -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 上的这个问题看起来非常相似。
| 归档时间: |
|
| 查看次数: |
1773 次 |
| 最近记录: |