Python中matplotlib将多张遥感影像绘制为多个子图并分别设定子图标题的方法

  本文介绍基于Python语言的matplotlib模块与gdal模块,读取大量长时间序列遥感影像,分别将其不同时相的图像作为子图,绘制在1个完整的大图中,并分别为每1个子图构建、显示标题的方法。

  首先,我们明确一下本文的需求。现有一个文件夹,其中包含大量.tif格式的遥感影像文件,如下图所示;其中,每1景遥感影像的文件名称中都含有其成像时间,且每1景图像成像时间都相差8天——从2021年的第001天开始,到第361天结束,一共是46景图像。

  我们希望实现的是,绘制每1景遥感影像,并将绘制得到的46景图像放在1个大图中,并且标注每1景图像具体的成像时间;最终的预期结果如下图所示。其中,下图仅展示了46景图像比较靠后的几景图像,大家理解意思即可。

  此外,从上图还可以看到,在结果图的末尾处,还有一个图例,表示图像中像元的数值。

  明确了需求,接下来即可开始代码的撰写。本文所用代码如下。

# -*- coding: utf-8 -*-
"""
Created on Wed Mar 13 21:04:48 2024@author: fkxxgis
"""import os
import fnmatch
import numpy as np
import matplotlib.pyplot as plt
from osgeo import gdal
from matplotlib.colors import LinearSegmentedColormapfile_path_tif = r"E:\04_Reconstruction\96_TIFF\GF_Original"
file_path_plot = r"E:\04_Reconstruction\96_TIFF"
file_extension = "*.tif"
band_idx = 4;
row = 12
col = 4file_all = os.listdir(file_path_tif)
file_all_tif = [file_tif for file_tif in file_all if fnmatch.fnmatch(file_tif, file_extension)]
file_all_tif.sort()if band_idx == 1:cmap_colors = [(0, "white"), (0.1, "powderblue"), (0.2, "lightblue"), (0.3, "lightskyblue"), (0.4, "skyblue"),(0.5, "deepskyblue"), (0.6, "cornflowerblue"), (0.7, "royalblue"), (0.8, "blue"),(0.9, "mediumblue"), (1, "darkblue")]cmap = LinearSegmentedColormap.from_list("", cmap_colors)file_pic_name = "blue_ori.png"
elif band_idx == 2:cmap_colors = [(0, "white"), (0.1, "palegreen"), (0.2, "lightgreen"), (0.3, "greenyellow"), (0.4, "lawngreen"),(0.5, "springgreen"), (0.6, "lime"), (0.7, "limegreen"), (0.8, "forestgreen"),(0.9, "green"), (1, "darkgreen")]cmap = LinearSegmentedColormap.from_list("", cmap_colors)file_pic_name = "green_ori.png"
elif band_idx == 3:cmap_colors = [(0, "white"), (0.1, "darksalmon"), (0.2, "salmon"), (0.3, "tomato"), (0.4, "orangered"),(0.5, "red"), (0.6, "indianred"), (0.7, "firebrick"), (0.8, "brown"),(0.9, "maroon"), (1, "darkred")]cmap = LinearSegmentedColormap.from_list("", cmap_colors)file_pic_name = "red_ori.png"
elif band_idx == 4:cmap_colors = [(0, "white"), (0.1, "ivory"), (0.2, "lemonchiffon"), (0.3, "papayawhip"), (0.4, "navajowhite"),(0.5, "sandybrown"), (0.6, "orange"), (0.7, "darkorange"), (0.8, "peru"),(0.9, "chocolate"), (1, "saddlebrown")]# cmap = LinearSegmentedColormap.from_list("", cmap_colors)cmap = "YlOrRd"file_pic_name = "NIR_ori_2.png"
else:cmap = "Greens"file_pic_name = "NDVI_MODIS.png"idx = 1
plt.rc("font", family = "Times New Roman")
fig = plt.figure(figsize = (10, 40))for file_tif in file_all_tif:dataset = gdal.Open(os.path.join(file_path_tif, file_tif))band = dataset.GetRasterBand(band_idx)array_band = band.ReadAsArray()array_band = np.nan_to_num(array_band, nan=0)if np.all(array_band == 0):img = plt.imshow(np.zeros((1, 1)), cmap = cmap)plt.axis("off")plt.title("2021" + str(idx * 8 - 7).zfill(3), y = -0.2)idx += 1continuearray_band[(array_band > 10000) | (array_band < 0)] = 0array_band = array_band / 10000dataset = Noneax = plt.subplot(row, col, idx)img = plt.imshow(array_band, cmap = cmap)plt.axis("off")plt.title("2021" + str(idx * 8 - 7).zfill(3), y = -0.2)print(idx, "finished!")idx += 1cax = plt.axes([0.66, 0.15, 0.24, 0.015])
colorbar = plt.colorbar(cax=cax, orientation="horizontal")
colorbar.outline.set_visible(False)
plt.savefig(file_path_plot + "/" + file_pic_name, dpi = 300, bbox_inches = "tight", pad_inches = 0)
plt.show()

  其中,代码的具体含义如下。

  首先,我们导入所需的模块和库。其中,os用于处理文件和路径操作,fnmatch用于文件名匹配,numpy用于处理数组数据,matplotlib.pyplot用于生成图像和子图,osgeo.gdal用于读取遥感图像数据,matplotlib.colors.LinearSegmentedColormap则用于定义自定义颜色映射。

  其次,我们定义一些变量。其中,file_path_tif为包含待绘图的遥感图像文件的路径,file_path_plot为生成的图像文件保存的路径,file_extension为待处理的图像文件的扩展名,band_idx为要处理的图像数据的波段索引(因为我这里每次只绘制1个波段,所以增加了这个参数);而rowcol则分别为生成的子图的行数和列数。

  接下来,我们获取符合条件的图像文件。其中,首先使用os.listdir()函数获取文件路径中的所有文件;随后,使用fnmatch()函数根据扩展名筛选出符合条件的文件,并对文件名按照首字母升序的顺序进行排序。

  随后,我们根据波段索引选择颜色映射。在我这里,是希望对具有蓝光、绿光、红光与近红外等4个波段的遥感影像加以绘制,每次绘制其中的1个波段;因此,对于不同的波段索引,定义不同的颜色映射;其中,对于不同波段,我们创建LinearSegmentedColormap对象,或使用预定义的颜色映射。其中,我们重点介绍一下本部分中的如下代码。

    cmap_colors = [(0, "white"), (0.1, "powderblue"), (0.2, "lightblue"), (0.3, "lightskyblue"), (0.4, "skyblue"),(0.5, "deepskyblue"), (0.6, "cornflowerblue"), (0.7, "royalblue"), (0.8, "blue"),(0.9, "mediumblue"), (1, "darkblue")]cmap = LinearSegmentedColormap.from_list("", cmap_colors)

  其中,我们定义了一个颜色映射,用于将图像数据的像素值映射到具体的颜色。cmap_colors是一个包含颜色映射信息的列表,其每个元素都是一个元组,包含两个值:第1个值是图像数据的归一化像素值(范围为01之间),第2个值是与归一化像素值对应的颜色。例如,(0, "white")表示归一化像素值为0时对应的颜色是白色(0.1, "powderblue")表示归一化像素值为0.1时对应的颜色是粉蓝色。而随后的这行代码,使用LinearSegmentedColormap类从颜色映射列表cmap_colors创建一个颜色映射对象cmapLinearSegmentedColormapmatplotlib.colors模块中的一个类,用于创建线性分段的颜色映射;其接受一个颜色映射列表作为输入,并根据列表中定义的归一化像素值和对应颜色的关系来生成颜色映射。

  回到前述完整的代码中。随后,即可开始循环处理每个图像文件。首先,打开图像文件并读取指定波段的数据;同时,对数据进行预处理,将无效值(NoData值)替换为0,并进行范围缩放——将异常数据都改为0,并将非异常数据缩小10000倍。接下来,创建子图并显示图像数据,按照图像编号设置成像时间并作为该子图的title,同时打印处理进度。

  最后,我们即可添加颜色条并保存图像。首先,在图像中添加颜色条;其次,保存生成的图像文件,并显示生成的图像。

  运行上述代码,可以得到如下所示的图片结果。

  图片比较模糊,但是可以看到,46景图像已经按照成像时间的顺序加以可视化了,且配置了图例。

  至此,大功告成。

欢迎关注:疯狂学习GIS

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/3814.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Hadoop之路

hadoop更适合在liunx环境下运行&#xff0c;会节省后期很多麻烦&#xff0c;而用虚拟器就太占主机内存了&#xff0c;因此后面我们将把hadoop安装到wsl后进行学习,后续学习的环境是Ubuntu-16.04 &#xff08;windows上如何安装wsl&#xff09; 千万强调&#xff0c;有的命令一…

Web前端一套全部清晰 ② day2 HTML 标签之文字排版,图片、链接、音视频链接

虽然辛苦&#xff0c;我还是会选择那种滚烫的人生 —— 24.4.25 HTML初体验 1.HTML定义 HTML 超文本标记语言 超文本 —— 链接 标记 —— 标记也叫标签&#xff0c;带尖括号的文本 标签语法 开始标签 需要加粗的文字 结束标签 标签成对出现&#xff0c;中间包裹内容 <>里…

Rabbitmq消息应答,持久化,权重分配(7)

消息应答 概览 消息应答机制是 RabbitMQ 中确保消息处理的可靠性和一致性的重要机制之一。当消费者从队列中接收到消息并处理完成后&#xff0c;通常需要向 RabbitMQ 发送一个明确的消息应答&#xff0c;以告知 RabbitMQ 消息已经被处理&#xff0c;并可以安全地从队列中移除…

如何消除浏览器SmartScreen对网站“不安全”提示?

面对互联网时代用户对网站安全性和可信度的严苛要求&#xff0c;网站运营者时常遭遇Microsoft Defender SmartScreen&#xff08;SmartScreen&#xff09;提示网站不安全的困扰。本文将剖析SmartScreen判定网站不安全的原因&#xff0c;并为运营者提供应对策略&#xff0c;以恢…

[最新]CentOS7设置开机自启动Hadoop集群

安装好Hadoop后我们可以使用开机自启动的方式&#xff0c;节约敲命令的时间。注意是centOS7版本!!!和centOS6版本区别非常大!!! 1、切换到系统目录 [rootmaster ~]# cd /etc/systemd [rootmaster systemd]# ll total 32 -rw-r--r-- 1 root root 720 Jun 30 23:11 bootcha…

ip https证书360

https证书主要作用是保障网络安全&#xff0c;在http协议的基础上通过SSL/TLS加密技术实现安全通信协议。对客户端以及服务器之间的传输数据进行加密&#xff0c;确保数据的完整性和机密性&#xff0c;维护用户隐私。通过HTTPS协议&#xff0c;我们可以安全地进行在线购物、网上…

【threejs教程7】threejs聚光灯、摄影机灯和汽车运动效果

【图片完整效果代码位于文章末】 在上一篇文章中我们实现了汽车模型的加载&#xff0c;这篇文章主要讲如何让汽车看起来像在运动。同时列出聚光灯和摄像机灯光的加载方法。 查看上一篇&#x1f449;【threejs教程6】threejs加载glb模型文件&#xff08;小米su7&#xff09;&…

Kubernetes学习-核心概念篇(一) 初识Kubernetes

&#x1f3f7;️个人主页&#xff1a;牵着猫散步的鼠鼠 &#x1f3f7;️系列专栏&#xff1a;Kubernetes渐进式学习-专栏 &#x1f3f7;️个人学习笔记&#xff0c;若有缺误&#xff0c;欢迎评论区指正 目录 1. 前言 2. 什么是Kubernetes 3. 为什么需要Kubernetes 3.1. 应…

【高校科研前沿】东北地理所在遥感领域顶刊RSE发布中国主要红树植物群落遥感分类成果

目录 01 文章简介 02 研究内容 03 文章引用 01 文章简介 论文名称&#xff1a;Mangrove species mapping in coastal China using synthesized Sentinel-2 high-separability images&#xff08;基于Sentinel-2高分离度图像的中国沿海红树群落制图&#xff09; 第一作者及…

口才培训需要多久才能看到成效?

口才培训需要多久才能看到成效&#xff1f; 口才培训需要多久才能看到成效&#xff0c;这个问题的答案因个体差异而异&#xff0c;受到多种因素的影响。以下是对此问题的详细分析&#xff1a; 首先&#xff0c;每个人的口才基础和学习能力不同。有些人可能天生具备良好的口才…

面试C++(基础篇)- C++是如何工作的?

1:C是如何工作的&#xff1f; 首先以一个最简单的Hello word程序入门来看&#xff1a; #include <iostream>int main() {std::cout << "Hello World!\n"<< std::endl;std::cin.get(); }1&#xff1a;#include是预编译命令&#xff0c;发生在编译…

WoodMart主题下载:为您的电商网站带来自然而优雅的购物体验

在电子商务的激烈竞争中&#xff0c;一个设计精良、用户友好的在线商店是吸引和保留客户的关键。WoodMart主题&#xff0c;作为一款专为Shopify平台设计的高级主题&#xff0c;以其自然美学和强大的功能&#xff0c;帮助您的商店在众多竞争对手中脱颖而出。 [WoodMart主题的核…

开源框架-链路追踪(SkyWalking)

SkyWalking 极简入门 | Apache SkyWalking 开发环境配置&#xff1a; -javaagent:D:\xxxxx\yyyy\skywalking-agent.jar -DSW_AGENT_NAMEspringboot-xxxx-demo -DSW_AGENT_COLLECTOR_BACKEND_SERVICES127.0.0.1:11800

多行Textview 计算切分后的长度,并回退长度

实现类似的效果&#xff0c;一个多行的 textview&#xff0c; 如果赋值一个超长的字符&#xff0c;尾部长度回退部分&#xff0c;并添加 ... 最后添加一个详情按钮。 如果不超长则不显示详情 效果如图&#xff1a; 获取截断之后的字符长度 fun getLimitedCharacterCount(textV…

Docker与Linux容器:“探索容器化技术的奥秘”

目录 一、Docker概述 二、容器技术的起源&#xff1a; 三、Linux容器 四、Docker的出现 五、Docker容器特点&#xff1a; 六、Docker三大概念&#xff1a; 容器&#xff1a; 镜像&#xff1a; 仓库&#xff1a; 七、Docker容器常用命令 一、Docker概述 在云原生时代&…

每周题解:拯救大兵瑞恩

题目描述 1944 年&#xff0c;特种兵麦克接到国防部的命令&#xff0c;要求立即赶赴太平洋上的一个孤岛&#xff0c;营救被敌军俘虏的大兵瑞恩。 瑞恩被关押在一个迷宫里&#xff0c;迷宫地形复杂&#xff0c;但幸好麦克得到了迷宫的地形图。 迷宫的外形是一个长方形&#x…

架构师的六大生存法则与价值创造

目录 什么影响架构的成败 架构师的六大生存法则 一、所有的架构规划必须有且只有一个正确的目标 二、架构活动需要尊重和顺应人性 三、架构活动在有限的资源下最大化商业价值 四、架构师要考虑依赖的商业模块和技术生命周期 五、架构师为什么要关注技术体系的外部适应性…

【DINO】环境配置

1. DINO简介 作为一款基于Transformer性能强劲的计算机视觉算法&#xff0c;一经发布即受追捧&#xff0c;本文记录下在DINO官方代码在集群上的环境配置及训练自己的数据集过程。 DINO原文&#xff1a;https://arxiv.org/abs/2203.03605 DINO源代码&#xff1a;https://github.…

2021长城杯(部分复现)

2021年4月25日&#xff0c;上午8点左右&#xff0c;警方接到被害人金某报案&#xff0c;声称自己被敲诈数万元&#xff1b;经询问&#xff0c;昨日金某被嫌疑人诱导裸聊&#xff0c;下载了某“裸聊”软件&#xff0c;导致自己的通讯录和裸聊视频被嫌疑人获取&#xff0c;对其进…

Oracle数据库的AI能力分析,释放企业数据价值

解锁Oracle数据库的AI潜力 Oracle数据库提供了一系列的AI能力&#xff0c;旨在帮助企业和开发者更高效地利用人工智能技术。以下是Oracle数据库AI能力的一些关键点&#xff1a;1. AI向量相似性搜索&#xff1a;Oracle Database 23c引入了AI Vector Search功能&#xff0c;该功…