前言

本来想绘制如下的色斑图,但一开始不知到它叫这个名字,从等值线开始查起,发现等值线绘制是个比较大且难的问题,会出现等值点计算、等值点追踪、等值线裁剪等一些列的部分所组成,预想到最后还可能会出现效率问题,然,现今已有很多成熟和软件已集成(实现)了该功能,故在查找方法(方式)过程中小伙伴发现了它原来的真实名字,好了,废话到此结束。

一、色斑图绘制

1. 加载数据

做加载的数据包括,经度、维度、降水值三类数据,我把它们存在了一个csv文件中了,由于数据提前已进行了插值处理,因此这里不再进行插值计算。

def get_origin_data(data_path, num):"""获取经纬度数据, 雨强数据:param data_path: 数据路径:param num: 格网数:return:"""df = pd.read_csv(data_path)     # 读取数据df.columns = ['lon', 'lat', 'rain']    # 列命名olon = np.array(df['lon']).reshape(num, num)    # 经度olat = np.array(df['lat']).reshape(num, num)    # 纬度rain = np.array(df['rain']).reshape(num, num)   # 雨强return olon, olat, rain

若需要插值可使用下面的代码,需要自行选择经纬度的范围和分辨率

olon = np.linspace (125,131,120) # 经纬坐标,0.05°分辨率
olat = np.linspace (44,47,60)         #  纬度坐标,0.05°分辨率
olon,olat = np.meshgrid(olon,olat)  # 生成坐标网格 meshgrid网格化
func = Rbf(lon,lat,rain,function='linear') #插值函数 调用Rbf插值函数中的 cubic 插值法linear
rain_data_new = func(olon,olat) #插值
rain_data_new[rain_data_new <0 ] = 0

2、等值线绘制和填充

def plot_contourf(olon, olat, rain, clevs, cdict):"""画等值线或色斑图:param olon: 经度:param olat: 纬度:param rain: 降水值:param clevs: 颜色级别:param cdict: 颜色列表:return:"""# 画布及绘图声明fig = plt.figure(figsize=(16, 9.6), facecolor='#666666', edgecolor='Blue', frameon=False)  # 画布ax = fig.add_subplot(111, projection=ccrs.PlateCarree())  # 绘图区my_cmap = colors.ListedColormap(cdict)  # 自定义颜色映射 color-mapnorm = mpl.colors.BoundaryNorm(clevs, my_cmap.N)  # 基于离散区间生成颜色映射索引#  绘制等值线、等值线填色cf = ax.contourf(olon, olat, rain, clevs, transform=ccrs.PlateCarree(), cmap=my_cmap, norm=norm)ct = ax.contour(olon, olat, rain, clevs)  # 绘制等值线ax.clabel(ct, fmt='%i')position = fig.add_axes([0.82, 0.2, 0.05, 0.2])  # 位置[左,下,宽。高]plt.colorbar(cf, cax=position)  # 颜色参照表position.set_yticklabels((0, 10, 25, 50, 100, 250, 500, 2000))ax.xaxis.set_major_formatter(LongitudeFormatter(zero_direction_label=True))ax.yaxis.set_major_formatter(LatitudeFormatter())ax.set_xticks(np.arange(125,131, 2), crs=ccrs.PlateCarree())  # x轴ax.set_yticks(np.arange(44, 47, 2), crs=ccrs.PlateCarree())  # y轴ax.gridlines()  # 显示背景线plt.show()

我这里用的是这篇文章的数据,在此表示感谢,经过等值线的绘制和填充出来的图片如下,色级定义为:
clevs = [0.1, 10., 25., 50., 100., 250., 500] # 自定义色级,颜色列表
cdict = [‘#A9F090’, ‘#40B73F’, ‘#63B7FF’, ‘#0000FE’, ‘#FF00FC’, ‘#850042’, ‘#FF8C00’]

3、等值线和区域裁剪

上面的图片我们只留下感兴趣的区域,对于此外的区域直接裁剪掉。

 clip = maskout.shp2clip(cf, ax, './shijie.shp', 'hrb')

maskout函数的内容如下:

import shapefile
from matplotlib.path import Path
from matplotlib.patches import PathPatchdef getPathFromShp(shpfile, region):try:sf = shapefile.Reader(shpfile)vertices = [] codes = [] paths = []for shape_rec in sf.shapeRecords():# if shape_rec.record[3] == region: if shape_rec.record[2] == region:  pts = shape_rec.shape.pointsprt = list(shape_rec.shape.parts) + [len(pts)]for i in range(len(prt) - 1):for j in range(prt[i], prt[i + 1]):vertices.append((pts[j][0], pts[j][1]))codes += [Path.MOVETO]codes += [Path.LINETO] * (prt[i + 1] - prt[i] - 2)codes += [Path.CLOSEPOLY]path = Path(vertices, codes)paths.append(path)if paths:path = Path.make_compound_path(*paths)else:path = Nonereturn pathexcept Exception as err:print(err)return Nonedef shp2clip(originfig, ax, shpfile, region):path = getPathFromShp(shpfile=shpfile, region=region)patch = Noneif path:patch = PathPatch(path, transform=ax.transData, facecolor='none', edgecolor='black')for contour in originfig.collections:contour.set_clip_path(patch)return path, patch

其中code是用来记录等值点的标志,1表示开始,2表示中间,97表示结束。
裁剪后的图如下所示:

shp边界数据来源:
链接:https://pan.baidu.com/s/14t_TTgQLChy9_NJS1zCnmg
提取码:113d

END

参考文献:

  • 1、 https://blog.csdn.net/qq_39425958/article/details/104790575
  • 2、 https://gitee.com/cnxd365/qixiangshujukeshihua/blob/master/maskout.py

python绘制降水色斑图相关推荐

  1. python画动图-Python绘制动态水球图过程详解

    先来看看绘制的动态水球图: 没有安装PyEcharts的,先安装PyEcharts: # 安装pyecharts模块,直接安装就是最新的版本pip install pyecharts 安装好PyEch ...

  2. python画折线图显示点值-Python 绘制可视化折线图

    1. 用 Numpy ndarray 作为数据传入 ply import numpy as np import matplotlib as mpl import matplotlib.pyplot a ...

  3. python画折线图代码-python绘制简单折线图代码示例

    1.画最简单的直线图 代码如下: import numpy as np import matplotlib.pyplot as plt x=[0,1] y=[0,1] plt.figure() plt ...

  4. python绘制雷达图代码实例-使用python绘制温度变化雷达图

    本文实例为大家分享了python绘制温度变化雷达图的具体代码,供大家参考,具体内容如下 假设某天某地每三个小时取样的气温为 针对温度变化趋势绘制雷达图: 代码如下: import numpy as n ...

  5. python画折线图详解-python绘制简单折线图代码示例

    1.画最简单的直线图 代码如下: import numpy as np import matplotlib.pyplot as plt x=[0,1] y=[0,1] plt.figure() plt ...

  6. python台风动图绘制_使用Python绘制台风轨迹图的示例代码

    参考: 使用CMA热带气旋最佳路径数据集,对我国周边的台风进行绘制 import re import os import numpy as np import matplotlib.pyplot as ...

  7. python画折线图代码实现_python如何绘制分布折线图 python绘制分布折线图代码示例...

    python如何绘制分布折线图?本篇文章小编给大家分享一下python绘制分布折线图代码示例,文章代码介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看. 用Pyth ...

  8. python能画k线图吗_,求教使用python绘制K线图

    如何用python实现视频关键帧提取并保存为图片 import cv2 vc = cv2.VideoCapture('Test.avi') #读入视频文件 c=1 if vc.isOpened(): ...

  9. python画简单图-python绘制简单彩虹图

    本文实例为大家分享了python绘制彩虹图的具体代码,供大家参考,具体内容如下 代码: from turtle import * #控制彩虹路径 def path(pen, r, g, b): pen ...

  10. python画折线图-python绘制简单折线图代码示例

    1.画最简单的直线图 代码如下: import numpy as np import matplotlib.pyplot as plt x=[0,1] y=[0,1] plt.figure() plt ...

最新文章

  1. SAP战略中的机器学习
  2. [转载] 30分钟泛型教程
  3. vs2010 unresolved external symbol error
  4. ajax 调用后台的方法
  5. Python内存管理方式和垃圾回收算法解析
  6. 力扣- -231. 2的幂
  7. @staticmethod用法
  8. centos lnmp源码安装mysql_CentOS 6.6 下源码编译安装MySQL 5.7.5
  9. 【IEnumerable】扩展方法的使用 C#
  10. 从小小后视镜看物联网的生态(下)
  11. Linux---弹球游戏
  12. Atitit 图像处理之理解卷积attilax总结
  13. hackmyvm之warez
  14. 【C语言】入门基础选择题附答案
  15. python星号怎么输入_python 星号*使用方法
  16. linux格式化只读u盘,linux下FAT32格式u盘只读的问题及解决方法
  17. 二等水准测量记录数据_二等水准测量记录计算示例.doc
  18. android连接雷电模拟器,android studio连接雷电模拟器 【AS 模拟器】
  19. 透明小时钟开发流程与总结
  20. path/filepath

热门文章

  1. echarts5.0 动态柱状图 不用调接口 不用jQuery舒适应用
  2. 多商户酒店预订小程序PMS管理系统成品源码
  3. SSH三大框架的工作原理及流程
  4. 线性代数同济第六版_线性代数不考内容+大纲等
  5. 线性代数复盘 | 同济大学工程数学第六版第二章思维导图笔记——矩阵及其运算(复习专用)
  6. 经典DOS游戏皇帝攻略(曾经的回忆)
  7. 远程设备运维云平台软件与常规组态软件的区别(V1.1)?
  8. 接口测试用例设计思路思维导图
  9. java从地址串中解析提取省市区-完美匹配中国所有地址
  10. matlab工具箱有哪些函数,matlab工具箱函数汇总(上)