需求: 尝试将CNN用于气象数据的分析中,因此打算构建一个基于中国边界的格子数据集,格子大小0.01,约为1km.
经过一些实践,得到绘制中国地图较优的经纬度范围,[72.5, 136.25, 3, 54.5]
为了减少研究区域,将纬度的下界设置为18, 得到:
由于MERRA2数据的分辨率0.5*0.625, 故下载数据时候的边界应为: (72.5, 136.25, 18, 54.5),即初步想法构成一个6376*3651的矩阵.
画图用到cartopy库,以及中国的边界文件china_country(注意边界文件包括.shp,.shx和.dbf三个文件).
import numpy as np
import pandas as pd
import matplotlib.cm as cm
# from mpl_toolkits.basemap import Basemap
# from netCDF4 import Dataset
import matplotlib.pyplot as plt
import netCDF4 as nc
import cartopy.feature as cfeature
import cartopy.io.shapereader as shpreader
import cartopy.crs as ccrs
# 粗略的估计研究的范围
a = np.arange(72.5, 136.26, 0.1) # 此处为了画图方便,将格子的大小控制为0.1
b = np.arange(18, 54.6, 0.1)
x, y = np.meshgrid(a, b)
test_data = np.ones(x.shape)
# 设置图像中的字体
plt.rcParams['font.family'] = 'Arial'
plt.rcParams['font.size'] = 10
plt.rcParams['font.weight'] = 'bold'
# 添加中国的海岸线
china = shpreader.Reader('../Dataset2015/china_country.shp').geometries()
proj = ccrs.PlateCarree()
fig = plt.figure(figsize=(6, 4.5))
ax = fig.add_subplot(1, 1 , 1, projection=proj)
ax.add_feature(cfeature.COASTLINE.with_scale('50m'), linewidth=1) # 添加海岸线
ax.add_geometries(china, ccrs.PlateCarree(), facecolor='none', edgecolor='k', linewidth=1, zorder=1) # 添加中国边界
import matplotlib as mpl
from matplotlib.colors import ListedColormap, LinearSegmentedColormap
# 自定义颜色条、色阶
cmap = mpl.cm.RdBu
newcolors=cmap(np.linspace(0, 1, 256))
newcmp = ListedColormap(newcolors[30:226])
# 绘制制定区域内的浓度图像
cf = ax.contourf(x, y, test_data, levels=50, cmap=newcmp,
transform=proj, extend='both')
# cb = fig.colorbar(cf, shrink=0.7, orientation='vertical', pad=0.15) # 设置颜色条的位置和标签
# cb.ax.set_xlabel('T2M(kg/$cm^2$)', fontweight='bold')
# cb.ax.tick_params(which='major', direction='in', length=3)
# 添加小格子
gl = ax.gridlines(alpha=0.8, linestyle='--', draw_labels=True,
dms=True, x_inline=False, y_inline=False)
gl.right_labels = 0
gl.top_labels = 0
# 添加中国的南海群岛
ax_sub = fig.add_axes([0.78,0.207,0.12,0.2], projection=proj) # [*left*, *bottom*, *width*,*height*] # add_axes函数中的rect参数,前两个变量为子图的位置,后两个变量为子图的大小
ax_sub.set_extent([105,125,0,25], crs=ccrs.PlateCarree()) # 设置子图的经纬度范围
ax_sub.add_feature(cfeature.COASTLINE.with_scale('50m')) # 添加子图的海岸线
china2 = shpreader.Reader('../Dataset2015/china_country.shp').geometries()
ax_sub.add_geometries(china2, ccrs.PlateCarree(), facecolor='none', edgecolor='r', linewidth=1, zorder=1)
参考文章: Python+Cartopy绘制中国地图