小白学习cartopy画地图的第六天
小白学习cartopy画地图的第六天
从开始学习画地图开始,就是打算用cartopy的,但是不知不觉跑偏了,跑去了Basemap,最近感觉这样不对,因为Basemap已经停止更新了,主要还是个人觉得cartopy逼格高一点,所以今天再次用cartopy来画图。
本帖主要内容如下:
1.介绍maskout.py文件,用于白化、掩膜
2.用cartopy画一个湖南省某个时刻的24小时降水量的分部
介绍maskout.py
很多朋友可能会在一些文章里面看到以下代码:
import maskout
然后以为这是一个库,然后就去pip install maskout了,然后发现装不了,嘿嘿,本人也是这么认为的,后来发现不是。这个其实就是某位大神写的一个掩膜py文件,其代码核心在我之前的帖子里面就有,就是利用matplotlib的PathPatch来做路径边缘白化的操作,大家可以去看我之前的帖子,当然也可以去网站上找一找,有人分享了。我下载下列以后做了一些修改,因为发现写的不够普适性,容易报错,对小白不友好,有需要的也可以留言找我要。
为了文章不至于太长,这里就不贴出来了。本质就是一个py文件,不是一个复杂的库。学会了我之前的帖子,可以忽略这个东西。
我建议大家拿到maskout.py以后也不要放到库的文件夹下面,这样可以时刻提醒自己这不是库,防止换电脑,换环境以后又去pip,还找不到
画cartopy地图,降水量
导入库
from read_mdfs import MDFS_Station
import numpy as np
from scipy.interpolate import Rbf
import matplotlib.pyplot as plt
import matplotlib.colors as colors
import cartopy.crs as ccrs
from cartopy.mpl.ticker import LongitudeFormatter, LatitudeFormatter
import maskout
画布和绘图区设置
plt.rcParams['font.sans-serif'] = ['SimHei']#正常显示中文
plt.rcParams['axes.unicode_minus'] = False#显示负号
fig = plt.figure(figsize=(16,9.6),facecolor='#666666', edgecolor='Blue', frameon=False)
ax = fig.add_subplot(111,projection = ccrs.PlateCarree())
读取micaps数据
x = MDFS_Station('r20210210100000.000')
lon = x.data['Lon']
lat = x.data['Lat']
var = x.data[1011]#24小时降水量
插值成格点数据
#对经纬度进行插值,这里作者讲经纬度插值成了0.05°*0.05°的网格
olon = np.linspace(108,115,140)
olat = np.linspace(24,31,140)
olon,olat = np.meshgrid(olon,olat)#组合成一个二维的网格坐标矩阵
#站点数据插值
func = Rbf(lon,lat,var,function='cubic')
var_new1 = func(olon,olat)
#筛选数据清洗
var_new1[var_new1 < 0] = 0
var_new1[var_new1 > 116] = 116
色彩定制:自己画色标(不均匀色标)
clevs = [0.1,10.,25.,50.,100.,250.,500.]#自定义颜色列表
cdict = ['#A6F28F','#3DBA3D','#61B8FF','#0000FF','#FA00FA','#800040']#自定义颜色列表
my_cmap = colors.ListedColormap(cdict)#自定义色板
norm = colors.BoundaryNorm(clevs,my_cmap.N)#归一化
画图设置
ax.xaxis.set_major_formatter(LongitudeFormatter(zero_direction_label=True))
ax.yaxis.set_major_formatter(LatitudeFormatter())
ax.set_xticks(np.arange(108,115,2),crs=ccrs.PlateCarree())
ax.set_yticks(np.arange(24,31,2),crs=ccrs.PlateCarree())
ax.gridlines()
到这为止,都是之前帖子的知识点,就不做讲解了。
画等值线和填色
填色
cf = ax.contourf(olon,olat,var_new1,clevs,transform=ccrs.PlateCarree(),cmap=my_cmap,norm =norm)
等值线及标签
ct = ax.contour(olon,olat,var_new1,clevs)
clabel = ax.clabel(ct,fmt='%i')
色标
position = fig.add_axes([0.74, 0.15, 0.05, 0.2])
plt.colorbar(cf, cax=position)
position.set_yticklabels((0.1,10.,25.,50.,100.,250.,500.))
掩膜
clip = maskout.shp2clip(cf,ax,'Hunan_Province')
clip = maskout.shp2clip(ct,ax,'Hunan_Province')
图中发现两个问题:
1.等值线数值标签没有白化
2.省界、地级市界没有画出
等值线数值标签修改
我的解决方法是直接修改标签坐标,定死标签位置,经过尝试,发现其实你的坐标不在的等值线上,他依旧会去找最近的等值线,很智能的一个设计。当然还有其他的方法,我只是觉得这样最简单。
clabel = ax.clabel(ct,fmt='%i',manual=[(110.6,28.6),(110.6,28.3),(111.7,27.6),(112.9,26.4),(112.5,26.5),(112.7,27.3)])
画省界
方法一
shpname = r'Hunan_Province.shp'
shapes = list(shapereader.Reader(shpname).geometries())
ax.add_geometries(shapes,crs=ccrs.PlateCarree(),edgecolor = 'k', facecolor = '', linewidth = 0.3)
这一种方法可以画省界,但是我的地级市SHP文件就会出错,所以我不推荐,感觉普适性有问题
方法二
直接读取shp文件用plot函数画,但是由于shp坐标点排列的问题,图片有问题
sf = Reader('Hunan_Province.shp', encoding='utf-8')
for shape_rec in sf.shapeRecords():pts = shape_rec.shape.points#边界点x,y = zip(*pts)#把经纬度分别给到x,yax.plot(x, y, '-', lw=1, color='k',transform=ccrs.PlateCarree())
画地级市也是一样的
方法三
但是我发现,用同样的地图文件,用Basemap读取就没问题,所以仿照Basemap,我在maskout.py内部写了一个一样的
maskout.readshapefile('Hunan_city.shp',linewidth=1,ax=ax)
拓展
那么问题来了,如果我想单独凸显某个地级市怎么做呢?
比如:
sf = Reader('Hunan_city.shp', encoding='utf-8')
pts = sf.shapeRecords()[3].shape.points#边界点
x,y = zip(*pts)#把经纬度分别给到x,y
ax.plot(x, y, '-', lw=2, color='r',transform=ccrs.PlateCarree())
大家可以自己去理解,也可以改写mask.py,写出一个自己的库
下一个问题,如果不画单独一个省呢,比如画京津冀、珠三角?
小白学习cartopy画地图的第六天相关推荐
- 小白学习cartopy画地图的第一天(中国行政区域图,含南海)
小白学习cartopy画地图的第一天(中国行政区域图,含南海) 这是地图小白的我学习用cartopy画地图的第一天,慢慢摸索慢慢学习,一步一步学会使用cartopy.后面会持续更新.其中很多是从各个博 ...
- Cartopy画地图第八天(冷空气南下,NCL色标使用)
Cartopy画地图第八天(冷空气南下,NCL色标使用) 相信很多朋友都看过这张漂亮的图吧 这是中国气象爱好者公众号画的一张反映冷空气的图片,当时就被惊艳到了,本帖就来复刻一下这张图. 本次的知识点大 ...
- Cartopy画地图第七天(python画浮雕地图和比例尺)
Cartopy画地图第七天(python画浮雕地图和比例尺) 本文利用了python.cartopy进行了浮雕地图的绘制,同时还画了比例尺. 先上图为敬,一些图例符号不对请不要介意,随便表示的 第一. ...
- 小白学习Basemap气象画地图的第三天(中国温度分布图,mask外部)
小白学习Basemap气象画地图的第三天(中国温度分布图,mask外部) 首先还是感谢公众号(气象学家),代码和测试数据来自与他,不过这次有长进了,自己学会修改了.还是逐条向大家解释. (和大家分享一 ...
- 小白学习Basemap气象画地图的第五天(读取micaps站点数据,省级能见度分布)
小白学习Basemap气象画地图的第五天(读取micaps站点数据,省级能见度分布) 这一帖子,主要介绍了三个重点: 1.micaps站点数据的读取 2.站点数据的插值 3.不均匀色标的生成 在下面的 ...
- 小白学习Basemap气象画地图的第四天(省级温度分布)
小白学习Basemap气象画地图的第四天(省级温度分布) 经过四个案例的学习,有了很大的进步,感谢(公众号:气象学家) 这次画一个省级温度分布,原理和程序与之前的全国一样,这里就不多说了,可以看注释, ...
- echarts geo地图示例_python小白的画地图合集(使用pyecharts)
经过今晚的小摸索,终于可以画出世界地图.省级地图以及全国的热力图.所以特此决定出一个小的合集,建议先去阅读上一篇写的画中国地图,可能那样子你会很快速了解到画图的精髓. 画世界地图 依旧是上次的套路: ...
- 『Python学习笔记』使用pycharts包画地图!
使用pycharts包画地图! 文章目录 一. 环境包的安装 二. 画中国地图 三. 参考文献 一. 环境包的安装 pyecharts的下载参考此文章(选择0.1.9.4版本):https://zhu ...
- python用cartopy包画地图_python绘制地图的利器Cartopy使用说明
python绘制地图一般使用Basemap绘图包,但该包配置相对较繁琐,自定义性不强,这里介绍一个绘制地图的利器Cartopy,个人认为该工具方便.快捷,附上一些自己写的程序. 准备工作,工欲善其事, ...
最新文章
- 如何利用CNKI句子检索功能提高研究效率
- 使用yum命令安装mysql_Linux Centos 下使用yum 命令安装mysql实现步骤
- 时序图如何表现分支_静态时序分析圣经翻译计划——第五章:延迟计算 (上)...
- 文字处理技术:形状绕排的难点
- MAC 终端git提交代码步骤
- 用 python 写了一个随机任务抽取器
- python tkinter 自主小项目——计算器往事
- 我的2016:做精彩的自己
- php 保持内容换行符,PHP 将内容写入word pdf 换行符不生效咋办
- 几个简单的c语言程序,几个简单的C语言源程序.docx
- [第一章 web入门]粗心的小李
- 更快更安全,HTTPS 优化总结
- C# 反射 实例化类
- Conexant ADSL USB 三步走猫
- iOS自动订阅商品(Auto-Renewable Subscriptions)相关处理
- ios11适配 以及会有的坑
- Virtual box中win7分辨率问题解决
- MacBook Linux Windows C和C++开发工具介绍
- 【吕鑫MFC学习】一个简单的MFC程序
- .NET开源工作流RoadFlow-快速入门