Python-matplotlib 空间栅格数据可视化
python-matplotlib 在地理空间数据可视化绘制方面也还是有一定的优势的,为更新colorbar绘制应用范围,我们把gis,遥感等专业的需要常做的空间可视化图,试着用matplotlib 进行绘制(也是小伙伴提出:用arcgis等软件在对多子图绘制colorbar时,存在无法共用的情况,即软件是一幅一幅的出图,导致汇总对比时,colorbar不统一,影响对比分析)
01. 数据处理
本次的tif数据需要用到专门的库进行读取,即使用gdal进行tif数据读取(gdal不仅包括tif数据读取,还包括投影转换、地理信息读取等功能,也是处理空间数据最常用的python库,如果只是单单读取tif文件数据,tifffile等包也能很好处理)。导入如下:
from osgeo import gdal
读取一幅tif影像,分别获取其行、列和通道数:
tif01 = r"F:DataCharmPython-matplotlib 空间数据可视化mod16a2200001.et_32767_0.1.tif"
tifdata01 = gdal.Open(tif01)
rows = tifdata01.RasterXSize
columns = tifdata01.RasterYSize
bands = tifdata01.RasterCount
rows,columns,bands
结果如下:
我们还可以获取这副tif数据如 地理信息、投影信息等数据,这也是处理空间数据用的最多的数据集系列。获取如下:
#获取地理信息
img_geotrans = tifdata01.GetGeoTransform()
#获取投影信息
img_proj = tifdata01.GetProjection()
这里用不到此类数据,就不做过多描述,后面涉及到坐标转换、投影转换等操作会详细讲解。
获取数组数据,用到如下代码:
#获取对应的数据
tif_data01 = tifdata01.ReadAsArray(0,0,samples,lines)
tif_data01,tif_data01.shape
结果如下:
可以看到数组中有很多nan值,而numpy对于数组梳理操作还是比较方便的。这里我们需要求取每个tif数组的最小值和最大值,而存在nan值的情况下,numpy也有对应的处理方式,十分方便。如下:
#求取除nan值外得最小值
np.nanmin(tif_data01)
#求取除nan值外得最大值
np.nanmax(tif_data01)
这一步非常关键,对后期统一颜色条(colorbar)至关重要,下面构建列表,存储每个tif数据的最大、最小值。如下:
min_list = []
max_list = []
min_list.append(np.nanmin(tif_data01))
min_list.append(np.nanmin(tif_data02))
min_list.append(np.nanmin(tif_data03))
data_min = np.min(min_list)
max_list.append(np.nanmax(tif_data01))
max_list.append(np.nanmax(tif_data02))
max_list.append(np.nanmax(tif_data03))
data_max = np.max(max_list)
最终获取三幅tif数据的最小、最大值如下:
02. 数据可视化
在对数据进行可视化展示,主要使用matplotlib的imshow()方法,完整代码如下:
fig,ax = plt.subplots(1, 3,figsize = (12,5),sharey=True)
vmin = data_min
vmax = data_max
#Normalize()跟归一化没有任何关系,函数的作用是将颜色映射到vmin-vmax上,
#颜色表/颜色柱的起始和终止分别取值vmin和vmax
norm = Normalize(vmin = vmin,vmax = vmax)
extent = (0,1,0,1)
im1 = ax[0].imshow(tif_data01,extent = extent,norm = norm,cmap = 'jet')
ax[0].set_axis_off()
im2 = ax[1].imshow(tif_data02,extent = extent,norm = norm,cmap = 'jet')
ax[1].set_axis_off()
im3 = ax[2].imshow(tif_data03,extent = extent,norm = norm,cmap = 'jet')
ax[2].set_axis_off()
ax[2].text(.8,-.02,'nVisualization by DataCharm',transform = ax[2].transAxes,
ha='center', va='center',fontsize = 10,color='black')
fig.subplots_adjust(right=0.9)
#前面三个子图的总宽度为全部宽度的 0.9;剩下的0.1用来放置colorbar
fig.subplots_adjust(right=0.9)
position = fig.add_axes([0.95, 0.22, 0.015, .55 ])#位置[左,下,右,上]
cb = fig.colorbar(im3, cax=position)
#设置colorbar标签字体等
colorbarfontdict = {"size":15,"color":"k",'family':'Times New Roman'}
cb.ax.set_title('Values',fontdict=colorbarfontdict,pad=8)
cb.ax.set_ylabel('EvapotTranspiration(ET)',fontdict=colorbarfontdict)
cb.ax.tick_params(labelsize=11,direction='in')
#cb.ax.set_yticklabels(['0','10','20','30','40','50','>60'],family='Times New Roman')
fig.suptitle('One Colorbar for Multiple Map Plot ',size=22,family='Times New Roman',
x=.55,y=.9)
plt.savefig(r'F:DataCharmPython-matplotlib 空间数据可视化map_colorbar.png',dpi = 600,
bbox_inches='tight',width = 12,height=4)
plt.show()
其中,imshow()方法中设置了norm参数和extent参数,其中norm参数决定colorbar的统一设置,extent参数可以如下图进行解释:
未设置extent参数:
设置extent参数:
ax.imshow(tif_data02,cmap = 'jet',extent = (0,1,0,1))
可以明显看到坐标轴的范围发生了明显改变。当然extent参数还可以设置其他数值,进行不同效果的展示。
最终绘制的效果如下:
该图有可能还缺少如横纵坐标等绘图参数,因为原始数据的坐标系需要转换成常规的经纬度信息,在这里就不进行展示了,后面的空间可视化绘制教程中会专门进行讲解。
03. 总结
这算是空间数据可视化绘制的第一篇推文了,感谢我的同学“小太阳”提供的数据。这也算是gis等专业同学经常需要绘制的学术图表之一,接下来可视化绘制教程也会偏空间数据居多,当然,也会根据小伙伴的提问进行其他专题的讲解,最终目的,还是希望我的教程能能够帮助到您
- JSP与EL表达式重点学习笔记(1)
- R语言读CSV、txt文件方式以及read.table read.csv 和readr(大数据读取包)
- JSP与EL表达式重点学习笔记(2)
- Node.js真的无所不能?那些不适用的应用领域分析
- #!/bin/bash 与#!/bin/sh
- 客户端无法连接数据库的小问题(r8笔记第53天)
- Golang事务模型
- 厚土Go学习笔记 | 35. web服务器实现动态路径
- 数据库连接池、dbutil_知识点全掌握
- Golang 序列化之 ProtoBuf
- Golang RPC 之 gRPC
- 解决连通性问题的四种算法
- 使用shell批量生成数据整合式迁移的脚本(r8笔记第52天)
- Jdbc知识点全整理,你值得拥有 (1)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Windows下登录凭证窃取技巧
- 小浩发现这篇浮点数的文章讲的真不错!
- 安全攻击溯源思路及案例
- 图解:「归并排序」
- STM32CubeMX6.0 + HAL + LittleVGL7.6 等学习[最全附工程源码]
- 国庆期间,我造了台计算机
- 编程语言的 IDE 支持
- 独家 | 手把手教你用Python的Prophet库进行时间序列预测
- 【Git】:基础的基础
- windows解决SpringBoot启动时:APPLICATION FAILED TO START
- 【Git】:基础操作篇
- 低光照图像增强算法汇总
- 用Python解决女朋友看电影没字幕的需求
- 【Git】:基础协作篇
- 最近,我用pandas处理了一把大数据……