前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >气象编程 | Python基础地图构建

气象编程 | Python基础地图构建

作者头像
气象学家
发布2020-12-18 16:21:05
1.8K0
发布2020-12-18 16:21:05
举报
文章被收录于专栏:气象学家气象学家

Python-basemap-中国南海小地图:

代码语言:javascript
复制
import numpy as np 
import matplotlib.pyplot as plt 
from mpl_toolkits.basemap import Basemap
import cmaps
import shapefile
from matplotlib.path import Path
from matplotlib.patches import PathPatch
import os
import maskout2
from netCDF4 import Dataset #netCDFを扱うため
nc = Dataset('F:/Rpython/lp14/MERRA2_400.tavgM_2d_slv_Nx.201912.nc4.nc4', mode='r')
lon = nc.variables["lon"][:].data
lat = nc.variables["lat"][:].data
t2m0= nc.variables["T2M"][:,:,:].data
t2m = t2m0.mean(axis=0)
grid_z = t2m -273.15
fig=plt.figure(figsize=(16,9))
ax=fig.add_subplot(111)
mp=Basemap(llcrnrlon=70,llcrnrlat=15,urcrnrlon=140,urcrnrlat=55,projection='cyl')
mp.drawparallels(np.arange(15, 55 + 1, 10), labels = [1, 0, 0, 0],fontsize=14,linewidth='0.2',color='black')
mp.drawmeridians(np.arange(70, 140 + 1, 10), labels = [0, 0, 0, 1],fontsize=14,linewidth='0.2',color='black')
CHN='F:/Rpython/lp27/data/china-shapefiles-master/'
mp.readshapefile(CHN+'china_nine_dotted_line','china_nine_dotted_line',drawbounds=True,linewidth=1.5)  
mp.readshapefile(CHN+'china','china',drawbounds=True)
clevs = np.arange(-50,50,10)
cf=plt.contourf(lon,lat,grid_z,clevs,cmap='Spectral_r',extend='both')
cbar=mp.colorbar(cf,location='right',size=0.3)
clip=maskout2.shp2clip(cf,ax,r'F:/Rpython/lp27/data/china-shapefiles-master/china_country')
#添加南海,实际上就是新建一个子图覆盖在之前子图的右下角
sub_ax = fig.add_axes([0.6888,0.1183,0.25,0.25])    #[*left*, *bottom*, *width*,*height*]
mf=Basemap(llcrnrlon=107,llcrnrlat=2,urcrnrlon=122,urcrnrlat=22,projection='cyl')
clevs2 = np.arange(-50,50,10)
cf2=sub_ax.contourf(lon, lat, grid_z,clevs2,cmap='Spectral_r')
CHN='F:/Rpython/lp27/data/china-shapefiles-master/'
mf.readshapefile(CHN+'china','china',drawbounds=True)
CHN='F:/Rpython/lp27/data/china-shapefiles-master/'
mf.readshapefile(CHN+'china_nine_dotted_line','china_nine_dotted_line',drawbounds=True,linewidth=1.5)
clip=maskout2.shp2clip(cf2,sub_ax,r'F:/Rpython/lp27/data/china-shapefiles-master/china_country')
plt.savefig(r"F:/Rpython/lp27/plot42.3.png",dpi=600)
plt.show()

Python-cartopy-中国南海小地图:

代码语言:javascript
复制
import maskout2
import os
import xarray as xr
import numpy as np
import cartopy.crs as ccrs
import cartopy.feature as cfeat
import matplotlib.colors as mcolors
from cartopy.io.shapereader import Reader
from cartopy.mpl.gridliner import LONGITUDE_FORMATTER, LATITUDE_FORMATTER
import matplotlib.pyplot as plt
import matplotlib.ticker as mticker
import cartopy.feature as cfeature
import cartopy.io.shapereader as shpreader
from cartopy.mpl.ticker import LongitudeFormatter,LatitudeFormatter
from matplotlib import rcParams
config = {"font.family":'Times New Roman', "font.size": 16, "mathtext.fontset":'stix'}
rcParams.update(config)
SHP = 'F:/Rpython/lp12/es'
# 数据读取
ds = xr.open_dataset(r'F:/Rpython/lp27/data/pr_Amon_FGOALS-f3-L_ssp370_r1i1p1f1_gr_201501-210012.nc')
pr = ds['pr']
#取一段时间内的降水作为绘图的数据yuan
pr_0=pr[793:1032]
pr_ave=pr_0.mean(dim='time')*86400*30*12
lon=ds.lon
lat=ds.lat
lon_range=lon[(lon>70)&(lon<140)]
lat_range=lat[(lat>0)&(lat<60)]
pr_region=pr_ave.sel(lon=lon_range,lat=lat_range)
# 创建画图空间
proj = ccrs.PlateCarree()  #创建投影
fig = plt.figure(figsize=(16,12))  #创建页面
ax = fig.subplots(1, 1, subplot_kw={'projection': proj})  #主图
# 设置网格点属性
region=[70, 140, 0, 60]
ax.set_extent(region,crs=proj)
ax.set_xticks(np.arange(region[0],region[1]+1,10),crs=proj)
ax.set_yticks(np.arange(region[-2],region[-1]+1,10),crs=proj)
#ax.grid(linestyle = '--')
ax.grid(linewidth=1.2,color='r',alpha=0.2,linestyle='--')
ax.xaxis.set_major_formatter(LongitudeFormatter(zero_direction_label=False))
ax.yaxis.set_major_formatter(LatitudeFormatter())
# 画图
levels = np.arange(0,3000,500)
font2={'family':'SimHei','size':20,'color':'k'}
ax.set_title('2080-2100年均降水总量unit:mm',loc='left',fontdict=font2)
cs=ax.contourf(lon_range,lat_range,pr_region,levels=levels,cmap='Spectral_r',transform=ccrs.PlateCarree(),extend='both')
b=plt.colorbar(cs,shrink=0.88,orientation='vertical',extend='both',pad=0.035,aspect=20)
#白化
ax.add_geometries(Reader(os.path.join(SHP,'bou2_4l.shp')).geometries(),ccrs.PlateCarree(),facecolor='none',edgecolor='k',linewidth=1)
clip=maskout2.shp2clip(cs,ax,r'F:/Rpython/lp3/hls/china0')
#添加南海,实际上就是新建一个子图覆盖在之前子图的右下角
f2_ax2=fig.add_axes([0.6566,0.133,0.1,0.17],projection=proj)
f2_ax2.set_extent([105,125,0,25],crs=ccrs.PlateCarree())
f2_ax2.add_feature(cfeature.COASTLINE.with_scale('50m'))
china=shpreader.Reader('F:/Rpython/lp12/es/bou2_4l.dbf').geometries()
f2_ax2.add_geometries(china,ccrs.PlateCarree(),facecolor='none',edgecolor='black',zorder=1)
cs3=f2_ax2.contourf(lon_range,lat_range,pr_region,range(0,3000,500),cmap='Spectral_r')
#白化
f2_ax2.add_geometries(Reader(os.path.join(SHP,'bou2_4l.shp')).geometries(),ccrs.PlateCarree(),facecolor='none',edgecolor='k',linewidth=1)
clip=maskout2.shp2clip(cs3,f2_ax2,r'F:/Rpython/lp3/hls/china0')
plt.savefig('F:/Rpython/lp27/plot8.7.png',dpi=300)
plt.show()#显示图片
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-12-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 气象学家 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档