【发布时间】:2023-03-13 18:27:01
【问题描述】:
在绘制来自 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()
我知道here 提出了一个有点类似的问题,但从未得到答复,而且最终问题似乎是将经纬度坐标与 x-y 坐标混淆了。我尝试切换到 x-y 坐标,但得到了相同的半图。知道这里会发生什么吗?
注意当使用datapc = map1.pcolormesh(lons, lats, data[season,:,:], vmin=vmin, vmax=vmax, cmap=cmap, latlon=True) 绘制未屏蔽数据时,整个世界都被绘制(陆地+海洋)。
【问题讨论】:
-
您是否有
myfile.nc的版本,可以在任何地方发布以允许重现问题?还是精简版?这是第一个猜测 - 您的数据可能运行 0-360 度而不是 -180 到 +180 度。这只是现阶段的猜测,但很明显,没有绘制经度 -180 到 0 处的内容。假设它们在您的数据中,它们必须由于某种原因被屏蔽或丢弃。如果不能显示myfile.nc,可以循环输出print(max(lons),min(lons))吗? -
确实,我的数据从 0 到 360,而不是从 -180 到 180。但是,当使用
datapc = map1.pcolormesh(lons, lats, data[season,:,:], vmin=vmin, vmax=vmax, cmap=cmap, latlon=True)绘制未屏蔽数据时,整个世界都被绘制(陆地+海洋)所以我没有不认为这是问题所在。我该如何调整这个?应该为掩码还是数据做? -
尝试(只是一个建议)在您从
nc中拉出lons_1d之后执行lons_1d[lons_1d>180]-=360。这有点神秘,但只是使用 numpy 花式索引来有条件地更改 180 到 360 之间的值。希望这能解决问题。如果没有 - 我明天去看看。 -
成功了!快速简便的修复,但我从来没有想过......!非常感谢!
标签: python plot netcdf matplotlib-basemap