python绘制降水色斑图
前言
本来想绘制如下的色斑图,但一开始不知到它叫这个名字,从等值线开始查起,发现等值线绘制是个比较大且难的问题,会出现等值点计算、等值点追踪、等值线裁剪等一些列的部分所组成,预想到最后还可能会出现效率问题,然,现今已有很多成熟和软件已集成(实现)了该功能,故在查找方法(方式)过程中小伙伴发现了它原来的真实名字,好了,废话到此结束。
一、色斑图绘制
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绘制降水色斑图相关推荐
- python画动图-Python绘制动态水球图过程详解
先来看看绘制的动态水球图: 没有安装PyEcharts的,先安装PyEcharts: # 安装pyecharts模块,直接安装就是最新的版本pip install pyecharts 安装好PyEch ...
- python画折线图显示点值-Python 绘制可视化折线图
1. 用 Numpy ndarray 作为数据传入 ply import numpy as np import matplotlib as mpl import matplotlib.pyplot a ...
- python画折线图代码-python绘制简单折线图代码示例
1.画最简单的直线图 代码如下: import numpy as np import matplotlib.pyplot as plt x=[0,1] y=[0,1] plt.figure() plt ...
- python绘制雷达图代码实例-使用python绘制温度变化雷达图
本文实例为大家分享了python绘制温度变化雷达图的具体代码,供大家参考,具体内容如下 假设某天某地每三个小时取样的气温为 针对温度变化趋势绘制雷达图: 代码如下: import numpy as n ...
- python画折线图详解-python绘制简单折线图代码示例
1.画最简单的直线图 代码如下: import numpy as np import matplotlib.pyplot as plt x=[0,1] y=[0,1] plt.figure() plt ...
- python台风动图绘制_使用Python绘制台风轨迹图的示例代码
参考: 使用CMA热带气旋最佳路径数据集,对我国周边的台风进行绘制 import re import os import numpy as np import matplotlib.pyplot as ...
- python画折线图代码实现_python如何绘制分布折线图 python绘制分布折线图代码示例...
python如何绘制分布折线图?本篇文章小编给大家分享一下python绘制分布折线图代码示例,文章代码介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看. 用Pyth ...
- python能画k线图吗_,求教使用python绘制K线图
如何用python实现视频关键帧提取并保存为图片 import cv2 vc = cv2.VideoCapture('Test.avi') #读入视频文件 c=1 if vc.isOpened(): ...
- python画简单图-python绘制简单彩虹图
本文实例为大家分享了python绘制彩虹图的具体代码,供大家参考,具体内容如下 代码: from turtle import * #控制彩虹路径 def path(pen, r, g, b): pen ...
- python画折线图-python绘制简单折线图代码示例
1.画最简单的直线图 代码如下: import numpy as np import matplotlib.pyplot as plt x=[0,1] y=[0,1] plt.figure() plt ...
最新文章
- SAP战略中的机器学习
- [转载] 30分钟泛型教程
- vs2010 unresolved external symbol error
- ajax 调用后台的方法
- Python内存管理方式和垃圾回收算法解析
- 力扣- -231. 2的幂
- @staticmethod用法
- centos lnmp源码安装mysql_CentOS 6.6 下源码编译安装MySQL 5.7.5
- 【IEnumerable】扩展方法的使用 C#
- 从小小后视镜看物联网的生态(下)
- Linux---弹球游戏
- Atitit 图像处理之理解卷积attilax总结
- hackmyvm之warez
- 【C语言】入门基础选择题附答案
- python星号怎么输入_python 星号*使用方法
- linux格式化只读u盘,linux下FAT32格式u盘只读的问题及解决方法
- 二等水准测量记录数据_二等水准测量记录计算示例.doc
- android连接雷电模拟器,android studio连接雷电模拟器 【AS 模拟器】
- 透明小时钟开发流程与总结
- path/filepath
热门文章
- echarts5.0 动态柱状图 不用调接口 不用jQuery舒适应用
- 多商户酒店预订小程序PMS管理系统成品源码
- SSH三大框架的工作原理及流程
- 线性代数同济第六版_线性代数不考内容+大纲等
- 线性代数复盘 | 同济大学工程数学第六版第二章思维导图笔记——矩阵及其运算(复习专用)
- 经典DOS游戏皇帝攻略(曾经的回忆)
- 远程设备运维云平台软件与常规组态软件的区别(V1.1)?
- 接口测试用例设计思路思维导图
- java从地址串中解析提取省市区-完美匹配中国所有地址
- matlab工具箱有哪些函数,matlab工具箱函数汇总(上)