前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >利用python绘制EC数据全国降水图

利用python绘制EC数据全国降水图

作者头像
郭好奇同学
发布2021-11-10 14:11:10
5.2K6
发布2021-11-10 14:11:10
举报
文章被收录于专栏:好奇心Log好奇心Log好奇心Log

Python的绘图功能非常强大,在大气和海洋常常用来绘制一些有关地理方面的图。本片主要介绍python绘制EC数据(grib格式)的的全国降水分布图。

总体流程:首先利用pygrib读取grib数据中的累计降水量数据,然后利用matplotlib进行绘图,其中利用cartopy进行地图shp文件的处理,并绘制南海小地图。

代码如下:

#导入需要的包,缺什么就pip安装什么,主要依赖matplotlib、pygrib、cartopy三个包。
import matplotlib
matplotlib.use('Agg')
import pygrib as pg
import matplotlib.pyplot as plt
import cartopy.io.shapereader as shpreader
import cartopy.crs as ccrs
import cartopy.feature as cfeature
import numpy as np
from pylab import * 
import matplotlib.colors as col
import matplotlib.cm as cm
from cartopy.mpl.gridliner import \
  LONGITUDE_FORMATTER, LATITUDE_FORMATTER
#读取文件,grib格式,全国的降水预报
ec_file='H:/2021/2021-08-16/D2S08160000081700001'
 
#读取变量
data=pg.open(ec_file)
rain_data = data.select(name='Total precipitation')[0]
rain= rain_data.values*1000 #转化单位
lat,lon=rain_data.latlons() #获取经纬度
 
#开始画图
proj = ccrs.PlateCarree()  # 创建投影
fig = plt.figure(figsize=(18, 18),dpi=800) #设置图片大小和分辨率
ax = fig.subplots(1, 1, subplot_kw={'projection':proj})
# 中国经纬度范围
region = [70, 136, 15, 55]
ax.set_extent(region, crs=proj)
ax.add_feature(cfeature.COASTLINE.with_scale('50m'),linewidth=0.6, zorder=1)
ax.add_feature(cfeature.RIVERS.with_scale('50m'),zorder=1)
ax.add_feature(cfeature.LAKES.with_scale('50m'),zorder=1)
#图标题
ax.set_title('EC:Total Precipitation(mm)',loc='left',fontsize=12)
time='Time:'+' 00:00:00(UTC)+24hours'
ax.set_title(time, loc='right',fontsize=12)
#网格线
gl = ax.gridlines(ylocs=np.arange(region[2],region[3] +10, 10), xlocs=np.arange(region[0], region[1] + 10, 10),
draw_labels=True, linestyle='--', alpha=0.7)
gl.xlabels_top = False
gl.ylabels_right = False
gl.xformatter = LONGITUDE_FORMATTER
gl.yformatter = LATITUDE_FORMATTER
 
#cpool = ['#FFFFFF', '#98FB98', '#32CD32',  '#00BFFF','#0000FF', '#FF00FF', '#800000']
#cmap3 = col.ListedColormap(cpool, 'indexed')
# 注意:cpool中有15个颜色,但是只使用了10个,其余的会被忽略
# 具体可查阅matplotlib官方文档中对ListedColormap的说明
#cm.register_cmap(name='dbzcmap', cmap=cmap3)
 
levels = [0,0.1,10,25,50,100,250]
#contours = plt.contourf(lon, lat, rain,levels=levels,extend='both',cmap='Accent',transform=ccrs.PlateCarree())
contours = plt.contourf(lon, lat,rain,levels=levels,extend='both',colors=('#FFFFFF', '#98FB98', '#32CD32',  '#00BFFF','#0000FF', '#FF00FF', '#800000'))
cbar = fig.colorbar(contours,shrink=0.4)#,ticks=levels)
cbar.set_label('Total Precipitation (mm)',fontsize=12)
 
# 获取国家基础地理数据,加载全国shp文件
#后台回复chinashp,获取全国的shapefile文件。
china = shpreader.Reader('H:/geo_data/国家基础地理数据400万/省.shp').geometries()
pro=shpreader.Reader('H:/geo_data/国家基础地理数据400万/国界线.shp').geometries()
# 绘制中国国界省界九段线等等
ax.add_geometries(china, proj,facecolor='none',edgecolor='black', zorder=1)
# 添加南海
sub_ax = fig.add_axes([0.115, 0.315, 0.1, 0.1], projection=proj)
sub_ax.set_extent([105, 125, 0,25],crs=ccrs.PlateCarree())
sub_ax.add_feature(cfeature.COASTLINE.
with_scale('50m'),linewidth=0.6, zorder=1)
sub_ax.add_geometries(pro, ccrs.PlateCarree(),edgecolor='black', zorder=1)#facecolor='none'
sub_ax.contourf(lon, lat,rain,levels=levels,extend='both',colors=('#FFFFFF', '#98FB98', '#32CD32',  '#00BFFF','#0000FF', '#FF00FF', '#800000'))

savedir='H:/plot_rain/EC.png'
plt.savefig(savedir)

最终效果如下:

在此提醒,国家版图是一个主权国家的重要标志,体现的是一个国家的完整政治主张,绝不仅是一张图画而已。所以在绘制地图时,特别是有国家分界线的一定多加要小心。

获取国家基础地理数据,加载全国shp文件,可以后台回复chinashp获取链接。

关注气海同途,获取更多大气海洋数值模拟相关内容。

往 期 推 荐

WRF模式安装

WRFChem的安装

WRF嵌套方式总结

MPAS-A模式的介绍

WRFDA的Little R格式介绍

ROMS区域海洋模式的安装和运行

风向搞不清?如何根据u v风求风向?

WRF中使用SRTM高分辨率的地形资料

构建适合大气与海洋应用的Anaconda环境

WRF后处理:降雨量的说明以及降雨的绘制

python爬取中央气象台台风网当前台风实况和预报数据

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-10-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 好奇心Log 微信公众号,前往查看

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

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

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