CMIP6出了,最近需要利用nc文件画一些世界地图,在网上找了一些教程后,发现画出来的图老是有贯穿整个地图的横线,而且还总有一条竖直的黑线显示数据缺失。后来查了pcolor的函数定义,才明白在定义坐标时不能使用nc文件中的’lon’和’lat’,而应该使用’lon_bnds’和’lat_bnds’,因为pcolor需要的是格点的边角坐标,而不是中心坐标。
因此具体代码如下:
from mpl_toolkits.basemap import Basemap
from netCDF4 import Dataset as NetCDFFile
import numpy as np
import matplotlib.pyplot as plt
#读取nc文件
nc = NetCDFFile('filename.nc')
Data = nc.variables['var'][:,:]
#设置图形基本参数以及投影信息
Fig = plt.figure(1, dpi=600,figsize=(8,6))
Ai = Fig.add_subplot(111, zorder=3)
m = Basemap(resolution='l', ax=Ai, projection='eck4', lon_0=0, lat_0=0)
m.drawcoastlines(color='k', linewidth=0.5)
#设置绘图的经纬度
lonsbd = nc.variables['lon_bnds'][:].filled(np.nan)
latsbd = nc.variables['lat_bnds'][:].filled(np.nan)
lonsbd1 = np.unique(lonsbd.flatten())
latsbd1 = np.unique(latsbd.flatten())
lon, lat = np.meshgrid(lonsbd1, latsbd1)
xi, yi = m(lon, lat)
#绘图
Pmap = m.pcolor(xi, yi, np.squeeze(Data), cmap='GnBu')
cbar = m.colorbar(Pmap, location='bottom', pad="5%")
这里选取的是eck4等面积投影,也可以在basemap函数的参数中更改为其他投影。最终效果如下:
希望可以帮到你!如果可以的话,欢迎投喂~