小白学习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画地图的第六天相关推荐

  1. 小白学习cartopy画地图的第一天(中国行政区域图,含南海)

    小白学习cartopy画地图的第一天(中国行政区域图,含南海) 这是地图小白的我学习用cartopy画地图的第一天,慢慢摸索慢慢学习,一步一步学会使用cartopy.后面会持续更新.其中很多是从各个博 ...

  2. Cartopy画地图第八天(冷空气南下,NCL色标使用)

    Cartopy画地图第八天(冷空气南下,NCL色标使用) 相信很多朋友都看过这张漂亮的图吧 这是中国气象爱好者公众号画的一张反映冷空气的图片,当时就被惊艳到了,本帖就来复刻一下这张图. 本次的知识点大 ...

  3. Cartopy画地图第七天(python画浮雕地图和比例尺)

    Cartopy画地图第七天(python画浮雕地图和比例尺) 本文利用了python.cartopy进行了浮雕地图的绘制,同时还画了比例尺. 先上图为敬,一些图例符号不对请不要介意,随便表示的 第一. ...

  4. 小白学习Basemap气象画地图的第三天(中国温度分布图,mask外部)

    小白学习Basemap气象画地图的第三天(中国温度分布图,mask外部) 首先还是感谢公众号(气象学家),代码和测试数据来自与他,不过这次有长进了,自己学会修改了.还是逐条向大家解释. (和大家分享一 ...

  5. 小白学习Basemap气象画地图的第五天(读取micaps站点数据,省级能见度分布)

    小白学习Basemap气象画地图的第五天(读取micaps站点数据,省级能见度分布) 这一帖子,主要介绍了三个重点: 1.micaps站点数据的读取 2.站点数据的插值 3.不均匀色标的生成 在下面的 ...

  6. 小白学习Basemap气象画地图的第四天(省级温度分布)

    小白学习Basemap气象画地图的第四天(省级温度分布) 经过四个案例的学习,有了很大的进步,感谢(公众号:气象学家) 这次画一个省级温度分布,原理和程序与之前的全国一样,这里就不多说了,可以看注释, ...

  7. echarts geo地图示例_python小白的画地图合集(使用pyecharts)

    经过今晚的小摸索,终于可以画出世界地图.省级地图以及全国的热力图.所以特此决定出一个小的合集,建议先去阅读上一篇写的画中国地图,可能那样子你会很快速了解到画图的精髓. 画世界地图 依旧是上次的套路: ...

  8. 『Python学习笔记』使用pycharts包画地图!

    使用pycharts包画地图! 文章目录 一. 环境包的安装 二. 画中国地图 三. 参考文献 一. 环境包的安装 pyecharts的下载参考此文章(选择0.1.9.4版本):https://zhu ...

  9. python用cartopy包画地图_python绘制地图的利器Cartopy使用说明

    python绘制地图一般使用Basemap绘图包,但该包配置相对较繁琐,自定义性不强,这里介绍一个绘制地图的利器Cartopy,个人认为该工具方便.快捷,附上一些自己写的程序. 准备工作,工欲善其事, ...

最新文章

  1. 如何利用CNKI句子检索功能提高研究效率
  2. 使用yum命令安装mysql_Linux Centos 下使用yum 命令安装mysql实现步骤
  3. 时序图如何表现分支_静态时序分析圣经翻译计划——第五章:延迟计算 (上)...
  4. 文字处理技术:形状绕排的难点
  5. MAC 终端git提交代码步骤
  6. 用 python 写了一个随机任务抽取器
  7. python tkinter 自主小项目——计算器往事
  8. 我的2016:做精彩的自己
  9. php 保持内容换行符,PHP 将内容写入word pdf 换行符不生效咋办
  10. 几个简单的c语言程序,几个简单的C语言源程序.docx
  11. [第一章 web入门]粗心的小李
  12. 更快更安全,HTTPS 优化总结
  13. C# 反射 实例化类
  14. Conexant ADSL USB 三步走猫
  15. iOS自动订阅商品(Auto-Renewable Subscriptions)相关处理
  16. ios11适配 以及会有的坑
  17. Virtual box中win7分辨率问题解决
  18. MacBook Linux Windows C和C++开发工具介绍
  19. 【吕鑫MFC学习】一个简单的MFC程序
  20. .NET开源工作流RoadFlow-快速入门

热门文章

  1. ARM920T内存管理单元MMU
  2. python3+requests+BeautifulSoup+mysql爬取豆瓣电影top250
  3. keil5 c语言函数库,C语言中KeilC51库函数大全.doc
  4. 2003服务器终极安全及问题解决方案
  5. 中国国内可用API合集
  6. ps 帧动画 也说 gif 动图
  7. 《半小时漫画中国哲学史》读书摘记
  8. 禁止复制服务器文件夹,远程桌面服务器 禁止复制文件夹
  9. 利用三角形三条边求三角形面积
  10. TCP 协议面试灵魂 12 问(二)