专栏首页气象学家Python气象绘图教程(十六)—Cartopy_6

Python气象绘图教程(十六)—Cartopy_6

本节提要:使用cartopy进行市县的色块填色、模仿geopandas绘制颜色图

一、利用cartopy进行市县的色块填色

其实geopandas在这方面比cartopy更加专业,由于是基于pandas的,所以在和表格类数据连接上的效果更好,不过cartopy也还能完成任务,虽然我想出的是个笨办法。

首先,还是通过meteoinfo或者GIS等软件读取图层属性:

然后在数据表中按照相同的市县顺序排列名称:

这一步是最麻烦的,但是一般市县也就十个以内,这一步工作是一劳永逸的。因为绘制业务地图的shp文件基本不会更改,所以排好序之后,每次制图只用更改excel(或者存储数据的文件)即可。

然后读入数据,绘制地图,关键代码如下:

dangercolors=df['预警颜色']
shp=shpreader.Reader(shppath)
for city,color in zip(shp.geometries(),dangercolors):#zip——并行遍历函数
    ax.add_geometries([city],proj,facecolor=color,edgecolor='k')

zip是py内置函数,可以直接调用,表示并行遍历。比如在这段程序中,for··· in ···逐个循环,在city循环的同时,color也同时循环,这样就可以实现绘制地图的同时给地图填色。

如果需要绘制新图,只需要修改excel中的数据即可:

二、使用cartopy绘制等级颜色图

前面的步骤和一中的一致:

shppath=r'E:\shp\行政边界.shp'
filepath=r'C:\Users\lenovo\Desktop\恩施分县.xlsx'
df=pd.read_excel(filepath)
size=df['数值']#读取旱情程度
shp=shpreader.Reader(shppath)#读取地理信息
max=100#确定旱情最大值,旱情程度从0到100
for city,s in (zip(shp.geometries(),size)):#并行遍历两个列表
    ax.add_geometries([city],proj,lw=1,facecolor=cmap((s/max)))#,edgecolor='k')
position=fig.add_axes([0,0,0.9,0.05])
cmap=plt.get_cmap('Reds')#获取颜色表
norm = mpl.colors.Normalize(vmin=0, vmax=100)
cb=fig.colorbar(mpl.cm.ScalarMappable(norm=norm, cmap=cmap),extend='both',
             cax=position, orientation='horizontal',shrink=1)
cb.set_label('墒情利好<<<>>>作物可能绝收',fontdict={'size':6}) 
cb.ax.set_title('干旱程度')            

在添加地理信息时,对facecolor同步填色,填色依据为该地区墒情数值与最大值max的相对大小。然后通过matplotlib官网上的自定义colorbar例子添加色条。实际上这个色条算是无源色条,和上面地图的填色只存在大小表示关系。像contourf填色图的色条就叫有源色条fig.colorbar(ax=ax),向内部传入了ax,只要ax变了,colorbar也跟随改变。

三、使用自定义的颜色

在某些时候,库包自带的颜色无法满足要求时,需要自定义颜色列表,结合前面的降水量色条定制,可以完成这个目标。

max=100
colorlevel=[0,70,75,80,85,90,95,100]#等级
colorlist=['tab:blue','tab:orange','tab:green','tab:red','tab:purple','tab:brown','tab:pink']#颜色列表
new_map=mcolors.ListedColormap(colorlist)#产生颜色映射
norm=mcolors.BoundaryNorm(colorlevel,new_map.N)#生成索引
for city,s in (zip(shp.geometries(),size)):
    ax.add_geometries([city],proj,lw=1,facecolor=new_map((s/max)),edgecolor='k')
position=fig.add_axes([0,0,0.9,0.05])
sm=plt.cm.ScalarMappable(cmap=new_map,norm=norm)
sm._A=[]
cb=plt.colorbar(sm,cax=position,extend='both',orientation='horizontal',shrink=1,label='等级量值与颜色')

本文分享自微信公众号 - 气象学家(Meteorologist2019)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-06-11

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Python-matplotlib 学术散点图完善

    上期的推文Python-matplotlib 学术型散点图绘制 推出后,很多小伙伴比较喜欢

    气象学家
  • Python气象绘图教程(十五)—Cartopy_5

    本节提要:仿制中央气象台气象服务图片、关于cartopy里的投影与转换、cartopy中extent与boundary。

    气象学家
  • Python高效批量绘图方法

    在数值预报后处理中经常需要批量出图,而基于matplotlib的图形渲染速度较慢,而提高出图的速度通常可通过两个方面来解决:

    气象学家
  • 微软发布 Linux 版威胁防护平台 Microsoft Defender ATP

    微软已经发布了适用于 Linux 的 Microsoft Defender ATP 的公开预览版。需要区分的是,Microsoft Defender 是微软的安...

    Debian社区
  • 建议收藏!Matplotlib常见组件设置整理

    继上一篇文章为大家介绍了plt和ax绘图的区别后,这篇文章结合我自己的一些使用经历,为大家整理了Matplotlib中比较常用的一些组件设置。

    bugsuse
  • python 类和对象

    一.编程范式 1.面向对象编程; 2.面向过程编程; 3.函数式编程 二.面向对象设计 面向对象设计:将一类具体事物的数据和动作整个到一起; 1.我们都学过函数...

    py3study
  • python面试题(持续更新)

    第1~10题 1、一行代码实现1--100之和 >>> sum(range(1,101)) 5050 >>> 2、如何在一个函数内部修改全局变量 a= 3 ...

    zhang_derek
  • 统计学习方法 Python 库

    源码地址:https://github.com/iOSDevLog/slmethod

    iOSDevLog
  • python 单元测试 -- unittest

    单元测试是对程序中的单个子程序、函数、过程进行的测试,面向白盒测试。 单元测试测试覆盖常用子程序的输入组合,边界条件和异常处理,尽可能保证单元测试代码简洁,避...

    orientlu
  • Java集合collection之Set

    2.TreeSet:将元素存储在红黑树中,按元素值顺序排列,比HashSet处理较慢。

    金GoS

扫码关注云+社区

领取腾讯云代金券