当前位置: 首页 > news >正文

MATLAB | 绘图复刻(十三) | 带NaN图例的地图绘制

有粉丝问我地图绘制如何添加NaN,大概像这样:

或者这样:

直接上干货:


原始绘图

假设我们有这样的一张图地图,注意运行本文代码需要去matlab官网下载Mapping Toolbox工具箱,但是其实原理都是相似的,如果M_map工具箱绘图也是类似的修改方法。

此外此处用到的nclCM函数如何获取请看这篇文章:https://slandarer.blog.csdn.net/article/details/127935365

或者去文末gitee仓库获取也行。

% 需要mapping toolbox
[Z,R]=readgeoraster('n39_w106_3arc_v2.dt1','OutputType','double');key.GTModelTypeGeoKey=2;
key.GTRasterTypeGeoKey=2;
key.GeographicTypeGeoKey=4326;filename='southboulder.tif';
geotiffwrite(filename,Z,R,'GeoKeyDirectoryTag',key)usamap([39 40],[-106 -105])
g=geoshow(filename,'DisplayType','mesh');% 190 300 363
colormap(nclCM(15,100))
cbHdl=colorbar();


1 方法一

1.1 添加NaN

对于这个工具箱的这种绘图方式,比如我们想将数值低于2100的数值改成NaN,首先将原始代码改成这样:

% 需要mapping toolbox
[Z,R]=readgeoraster('n39_w106_3arc_v2.dt1','OutputType','double');key.GTModelTypeGeoKey=2;
key.GTRasterTypeGeoKey=2;
key.GeographicTypeGeoKey=4326;filename='southboulder.tif';
% 设置NaN值
Z(Z<2100)=nan;
geotiffwrite(filename,Z,R,'GeoKeyDirectoryTag',key)usamap([39 40],[-106 -105])
g=geoshow(filename,'DisplayType','mesh');% 190 300 363
colormap(nclCM(15,100))
cbHdl=colorbar();

1.2 生成NaN图例

在绘图区域外绘制个小方块并生成图例:

% 绘制nan图例
nanHdl=fill([0,1,1,0]-1000,[0,0,1,1]-1000,[240,240,240]./255,...'EdgeColor','none','EdgeColor',[160,160,160]./255,'LineWidth',1.2,...'DisplayName',' NaN');
lgdHdl=legend(nanHdl);

1.3 修改图例位置

将上一步的代码改成这样(可能大家绘图比例不同需要根据实际情况微调):

% 修改colorbar位置
tPosition=cbHdl.Position;
cbHdl.Position(1)=cbHdl.Position(1)+tPosition(3).*1.5;
cbHdl.Position(2)=cbHdl.Position(2)+tPosition(4)./10;
cbHdl.Position(4)=cbHdl.Position(4)-tPosition(4)./10;% 绘制nan图例
nanHdl=fill([0,1,1,0]-1000,[0,0,1,1]-1000,[240,240,240]./255,...'EdgeColor','none','EdgeColor',[160,160,160]./255,'LineWidth',1.2,...'DisplayName',' NaN');
lgdHdl=legend(nanHdl);
lgdHdl.Box='off';
lgdHdl.ItemTokenSize=[16,16];
lgdHdl.Position(1)=tPosition(1)+tPosition(3).*1.3;
lgdHdl.Position(2)=tPosition(2);

1.4 方法一完整代码

% 需要mapping toolbox
[Z,R]=readgeoraster('n39_w106_3arc_v2.dt1','OutputType','double');key.GTModelTypeGeoKey=2;
key.GTRasterTypeGeoKey=2;
key.GeographicTypeGeoKey=4326;filename='southboulder.tif';
% 设置NaN值
Z(Z<2100)=nan;
geotiffwrite(filename,Z,R,'GeoKeyDirectoryTag',key)usamap([39 40],[-106 -105])
g=geoshow(filename,'DisplayType','mesh');% 190 300 363
colormap(nclCM(15,100))
cbHdl=colorbar();
% 修改colorbar位置
tPosition=cbHdl.Position;
cbHdl.Position(1)=cbHdl.Position(1)+tPosition(3).*1.5;
cbHdl.Position(2)=cbHdl.Position(2)+tPosition(4)./10;
cbHdl.Position(4)=cbHdl.Position(4)-tPosition(4)./10;% 绘制nan图例
nanHdl=fill([0,1,1,0]-1000,[0,0,1,1]-1000,[240,240,240]./255,...'EdgeColor','none','EdgeColor',[160,160,160]./255,'LineWidth',1.2,...'DisplayName',' NaN');
lgdHdl=legend(nanHdl);
lgdHdl.Box='off';
lgdHdl.ItemTokenSize=[16,16];
lgdHdl.Position(1)=tPosition(1)+tPosition(3).*1.3;
lgdHdl.Position(2)=tPosition(2);

2 方法二

2.1 重设范围

这里假设NaN值被存为了-999,我们将将NaN部分数值设置为非NaN值最小值-1/10的非NaN值数值范围,这样colorbar灰色部分的长度就会是不是灰色的部分长度的1/10。

% 需要mapping toolbox
[Z,R]=readgeoraster('n39_w106_3arc_v2.dt1','OutputType','double');key.GTModelTypeGeoKey=2;
key.GTRasterTypeGeoKey=2;
key.GeographicTypeGeoKey=4326;filename='southboulder.tif';
% 假设NaN值被存为-999
Z(Z<2100)=-999;% 将其数值设置为非NaN值最小值-1/10的非NaN值数值范围
% 这样colorbar灰色部分的长度就会是不是灰色的部分长度的1/10;
Z(Z==-999)=nan;minVal=min(min(Z));
Z(isnan(Z))=min(min(Z))-(max(max(Z))-min(min(Z)))./10;
geotiffwrite(filename,Z,R,'GeoKeyDirectoryTag',key)usamap([39 40],[-106 -105])
g=geoshow(filename,'DisplayType','mesh');

2.2 修改配色

往colormap前面续加上一段等长的灰色:

CList=nclCM(15,100);
CList=[(CList(:,1).*0+1)*[240,240,240]./255;CList];
colormap(CList)
cbHdl=colorbar();

2.3 中心移动到NaN与数值交界处

使用我自己写的setPivot函数:

function setPivot(varargin)
% @author:slandarer
if nargin==0ax=gca;pivot=0;
elseif isa(varargin{1},'matlab.graphics.axis.Axes')ax=varargin{1};if nargin>1pivot=varargin{2};elsepivot=0;endelseax=gca;pivot=varargin{1};end
end
tryCLimit=get(ax,'CLim');
catch
end
tryCLimit=get(ax,'ColorLimits');
catch
end
% CMap=get(ax,'Colormap');
CMap=colormap(ax);CLen=[pivot-CLimit(1),CLimit(2)-pivot];
if all(CLen>0)[CV,CInd]=sort(CLen);CRatio=round(CV(1)/CV(2).*300)./300;CRatioCell=split(rats(CRatio),'/');if length(CRatioCell)>1Ratio=[str2double(CRatioCell{1}),str2double(CRatioCell{2})];Ratio=Ratio(CInd);N=size(CMap,1);CList1=CMap(1:floor(N/2),:);CList2=CMap((floor(N/2)+1):end,:);if mod(N,2)~=0CList3=CList2(1,:);CList2(1,:)=[];CInd1=kron((1:size(CList1,1))',ones(Ratio(1)*2,1));CInd2=kron((1:size(CList2,1))',ones(Ratio(2)*2,1));CMap=[CList1(CInd1,:);repmat(CList3,[Ratio(1)+Ratio(2),1]);CList2(CInd2,:)];elseCInd1=kron((1:size(CList1,1))',ones(Ratio(1),1));CInd2=kron((1:size(CList2,1))',ones(Ratio(2),1));CMap=[CList1(CInd1,:);CList2(CInd2,:)];end% set(ax,'Colormap',CMap)colormap(ax,CMap);end
end
end

中心移动到NaN与数值交界处:

% 调整配色范围
setPivot(minVal)

2.4 修改图例标签

% 调整colorbar标签文字
cbHdl.TickLabels{cbHdl.Ticks<minVal}='';
cbHdl.TickLabels{1}='NaN';

2.5 方法二完整代码

% 需要mapping toolbox
[Z,R]=readgeoraster('n39_w106_3arc_v2.dt1','OutputType','double');key.GTModelTypeGeoKey=2;
key.GTRasterTypeGeoKey=2;
key.GeographicTypeGeoKey=4326;filename='southboulder.tif';
% 假设NaN值被存为-999
Z(Z<2100)=-999;% 将其数值设置为非NaN值最小值-1/10的非NaN值数值范围
% 这样colorbar灰色部分的长度就会是不是灰色的部分长度的1/10;
Z(Z==-999)=nan;minVal=min(min(Z));
Z(isnan(Z))=min(min(Z))-(max(max(Z))-min(min(Z)))./10;
geotiffwrite(filename,Z,R,'GeoKeyDirectoryTag',key)usamap([39 40],[-106 -105])
g=geoshow(filename,'DisplayType','mesh');% 往colormap前面续加上一段等长的灰色
CList=nclCM(15,100);
CList=[(CList(:,1).*0+1)*[240,240,240]./255;CList];
colormap(CList)
cbHdl=colorbar();% 调整配色范围
setPivot(minVal)% 调整colorbar标签文字
cbHdl.TickLabels{cbHdl.Ticks<minVal}='';
cbHdl.TickLabels{1}='NaN';

以上已经是完整代码,懒得一一搜集文件可以从以下Gitee仓库获取,setPivot函数和nclCM工具包我也一块扔文件夹啦:

  • https://gitee.com/slandarer/PLTreprint/

相关文章:

MATLAB | 绘图复刻(十三) | 带NaN图例的地图绘制

有粉丝问我地图绘制如何添加NaN&#xff0c;大概像这样&#xff1a; 或者这样&#xff1a; 直接上干货&#xff1a; 原始绘图 假设我们有这样的一张图地图&#xff0c;注意运行本文代码需要去matlab官网下载Mapping Toolbox工具箱&#xff0c;但是其实原理都是相似的&…...

netty整合websocket(完美教程)

websocket的介绍&#xff1a; WebSocket是一种在网络通信中的协议&#xff0c;它是独立于HTTP协议的。该协议基于TCP/IP协议&#xff0c;可以提供双向通讯并保有状态。这意味着客户端和服务器可以进行实时响应&#xff0c;并且这种响应是双向的。WebSocket协议端口通常是80&am…...

选择PC示波器的10种理由!

PC示波器&#xff08;PCs&#xff09;在测试仪器领域中的关键项目上正迅速地取代传统的数字存储示波器&#xff08;DSOs&#xff09;&#xff0c;其中有十个理由&#xff1a; 小巧和便携示波器利用你的PC显示器实现大屏幕和精细彩色显示信号存储只受限于你的PC存储器大小捕捉波…...

【pytorch深度学习 应用篇02】训练中loss图的解读,训练中的问题与经验汇总

文章目录 loss图解析train loss ↘ \searrow ↘ ↗ \nearrow ↗ 先降后升 loss图解析 train loss ↘ \searrow ↘ 不断下降&#xff0c;test loss ↗ \nearrow ↗ 不断上升&#xff1a;原因很多&#xff0c;我是把workers1&#xff0c;batchSize8192train loss ↘ \searro…...

uniapp 微信小程序如何实现多个item列表的分享

以下代码是某个循环里面的item <button class"cu-btn" style"background-color: transparent;padding: 0;"open-type"share" :data-tree"item.treeId" :data-project"item.projectId"v-if"typeId1 && userI…...

.NET 8 正式 GA 遥遥领先

.NET 8 一正式 已正式 GA。 微软称 .NET 8 提供了数以千计的性能、稳定性和安全性改进&#xff0c;以及平台和工具增强功能&#xff0c;有助于提高开发者的工作效率和创新速度。 比如 .NET 8 为 Android 和 WASM 引入了全新的 AOT 模式、改进 System.Text.Json&#xff0c;以…...

2216. 美化数组的最少删除数 --力扣 --JAVA

题目 给你一个下标从 0 开始的整数数组 nums &#xff0c;如果满足下述条件&#xff0c;则认为数组 nums 是一个 美丽数组 &#xff1a; nums.length 为偶数对所有满足 i % 2 0 的下标 i &#xff0c;nums[i] ! nums[i 1] 均成立 注意&#xff0c;空数组同样认为是美丽数组。…...

DDD 领域驱动设计

文章目录 请解释下什么是 DDD 领域驱动设计DDD 的四层领域模型是怎样的&#xff1f;包含哪些基础概念&#xff1f;DDD 中的贫血模型和充血模型有什么区别在 DDD 中&#xff0c;如何处理模型的聚合和聚合根DDD 中的实体和值对象有什么区别&#xff1f;在 DDD 中&#xff0c;如何…...

转型做视频了,博客就是稿子,继续坚持写博客,同时发布视频,能写博客说明思路清晰了,能再讲明白,理解就更透彻了,紧跟上时代发展。

1&#xff0c;今天特别记录下&#xff0c;B站给开通了《合集》功能 最近使用视频制作了几个视频。播放量还不错&#xff0c;最好的已经到了 2.6K了。 然后粉丝也涨到了 200个。 添加链接描述 紧跟时代&#xff1a;从写博客到录视频&#xff0c;粉丝大涨&#xff0c;突破200个&…...

小众市场:探索跨境电商中的利基领域

随着全球数字化和互联网的普及&#xff0c;跨境电子商务已经成为了一个蓬勃发展的产业。从亚马逊到阿里巴巴&#xff0c;大型电商平台已经占据了很大一部分市场份额。 然而&#xff0c;在这个竞争激烈的领域&#xff0c;寻找小众市场和利基领域可能是一种成功的策略。本文将探…...

C++中的mutable关键字

mutable是C中的一个关键字&#xff0c;它用来修饰类的成员变量。 当我们将一个成员变量声明为mutable时&#xff0c;就意味着这个成员变量可以被类的任何方法修改&#xff0c;即使这个方法是const类型的。这是因为mutable关键字可以打破const类型的限制&#xff0c;使得const类…...

java: 无效的目标发行版: 17 问题解决

今天在写完类点击运行后显示java: 无效的目标发行版: 17 网上查询了一番&#xff0c;发现有几个地方需要注意。 还有一个就是设置中&#xff0c;下面的就是我本次问题所在&#xff0c;不知道为什么&#xff0c;他自动添加了下面的东西 一个方法是把目标字节码版本改为正确的&a…...

C#的LINQ查询

当使用LINQ&#xff08;Language Integrated Query&#xff09;查询时&#xff0c;我们可以在C#中以一种类似于SQL的语法来查询数据。LINQ提供了一种统一的方式来查询各种数据源&#xff0c;如集合、数据库、XML等。 在上述示例中&#xff0c;我们使用LINQ查询来将两个列表根据…...

Python不会调试不够丝滑?那事你不会logging---剖析!

前言: 一直都是手动debug进行调试,F8都按烂了;最近用logging进行提前布置,发现这样更能让代码走得丝滑,同时也能尽早发现问题! 基本概念&#xff1a; Logger - 日志记录接口 Handler - 确定日志记录发送到不同的地方&#xff08;文件、控制台等&#xff09; Level - 定义了日…...

OpenAI的Whisper蒸馏:蒸馏后的Distil-Whisper速度提升6倍

1 Distil-Whisper诞生 Whisper 是 OpenAI 研发并开源的一个自动语音识别&#xff08;ASR&#xff0c;Automatic Speech Recognition&#xff09;模型&#xff0c;他们通过从网络上收集了 68 万小时的多语言&#xff08;98 种语言&#xff09;和多任务&#xff08;multitask&am…...

Ubuntu18.04安装LeGO-LOAM保姆级教程

系统环境&#xff1a;Ubuntu18.04.6 LTS 1.LeGO-LOAM的安装前要求&#xff1a; 1.1 ROS安装&#xff1a;参考我的另一篇博客Ubuntu18.04安装ROS-melodic保姆级教程_灬杨三岁灬的博客-CSDN博客文章浏览阅读168次。Ubuntu18.04安装ROS-melodic保姆级教程https://blog.csdn.net/…...

git修改commit历史提交时间、作者

1、修改最近的几条记录&#xff0c;进入提交记录列表&#xff0c;修改提交记录模式 git rebase -i HEAD~3 // 修改最近的三条记录&#xff0c;顺序排列按提交时间升序 指令说明&#xff1a; pick&#xff1a;保留该commit&#xff08;缩写:p&#xff09; reword&#xff1a…...

【C++历练之路】list的重要接口||底层逻辑的三个封装以及模拟实现

W...Y的主页 &#x1f60a; 代码仓库分享&#x1f495; &#x1f354;前言&#xff1a; 在C的世界中&#xff0c;有一种数据结构&#xff0c;它不仅像一个神奇的瑰宝匣&#xff0c;还像一位能够在数据的海洋中航行的智慧舵手。这就是C中的list&#xff0c;一个引人入胜的工具…...

Kubeadm部署Kubernetes Containerd集群

文章目录 概述一、硬件系统二、基础配置设置主机名配置主机名与IP地址解析关闭防火墙与selinux时间同步(ntp)升级系统内核配置内核转发及网桥过滤*安装ipset及ipvsadm关闭SWAP分区 三、Containerd准备Containerd获取下载解压Containerd配置文件生成并修改Containerd启动及开机自…...

OpenCV入门9——目标识别(车辆统计)

文章目录 图像轮廓查找轮廓绘制轮廓轮廓的面积与周长多边形逼近与凸包外接矩形项目总览【车辆统计】视频加载【车辆统计】去背景【车辆统计】形态学处理【车辆统计】逻辑处理【车辆统计】显示信息【车辆统计】 图像轮廓 查找轮廓 # -*- coding: utf-8 -*- import cv2 import n…...

多GPU编程中的向量点积计算

在现代计算中,多GPU环境下的并行计算变得越来越普遍。今天我们将探讨如何使用CUDA和OpenMP实现一个在多GPU上进行向量点积计算的例子。通过这个实例,我们可以理解在多GPU环境下如何进行数据分配、计算任务的分割以及结果的汇总。 背景知识 向量点积是两个等长向量相乘并求和…...

IP-XACT与嵌入式系统设计自动化实践

1. IP-XACT与嵌入式系统设计自动化革命在2000年代初的半导体行业&#xff0c;设计团队面临着一个日益严峻的挑战&#xff1a;随着SoC复杂度呈指数级增长&#xff0c;传统基于RTL的设计方法已经无法应对集成数十个IP核的现代芯片开发需求。正是在这样的背景下&#xff0c;SPIRIT…...

微信小程序跑腿平台(30263)

有需要的同学&#xff0c;源代码和配套文档领取&#xff0c;加文章最下方的名片哦 一、项目演示 项目演示视频 二、资料介绍 完整源代码&#xff08;前后端源代码SQL脚本&#xff09;配套文档&#xff08;LWPPT开题报告/任务书&#xff09;远程调试控屏包运行一键启动项目&…...

亚马逊多账号运营选择什么指纹浏览器?说说我的使用体验!

刚给上个月的一堆退货单盖完公章&#xff0c;心绞痛得厉害。在成都做亚马逊铺货熬了整整三年&#xff0c;天天提心吊胆怕被平台一锅端&#xff0c;今天索性关起门来&#xff0c;跟大伙盘盘多店铺防连坐这笔让人头秃的烂账。以前我是真没少轮流交智商税&#xff0c;紫鸟、AdsPow…...

AI智能体长时记忆解决方案:agent-recall架构设计与工程实践

1. 项目概述&#xff1a;一个为AI智能体打造的“记忆宫殿”最近在折腾AI智能体&#xff08;Agent&#xff09;的开发&#xff0c;一个绕不开的痛点就是“记忆”问题。你肯定也遇到过&#xff1a;让智能体帮你写个周报&#xff0c;它记得你上周干了啥&#xff0c;但完全忘了上个…...

物联网系统设计实战:从安全架构到低功耗优化的工程实践

1. 物联网热潮下的冷思考&#xff1a;我们真的准备好了吗&#xff1f;最近几年&#xff0c;物联网&#xff08;IoT&#xff09;和工业物联网&#xff08;IIoT&#xff09;绝对是科技圈最炙手可热的话题之一。无论是行业峰会、技术论坛还是产品发布会&#xff0c;几乎言必称IoT。…...

告别繁琐调参!基于ESO的PMSM无差拍预测控制Simulink仿真建模全流程(附模型文件)

永磁同步电机控制实战&#xff1a;从理论到Simulink仿真的ESO无差拍预测控制 电机控制领域的技术迭代从未停歇&#xff0c;而永磁同步电机&#xff08;PMSM&#xff09;因其高效率、高功率密度等优势&#xff0c;已成为工业驱动和伺服系统的核心部件。在众多控制策略中&#xf…...

从GitHub个人项目学习ChatGPT API集成与健壮性优化

1. 项目概述&#xff1a;一个被误解的“ChatGPT”仓库在GitHub上搜索“ChatGPT”&#xff0c;你会得到成千上万个结果。其中&#xff0c;一个名为HemulGM/ChatGPT的仓库&#xff0c;仅从标题来看&#xff0c;很容易让人误以为这是OpenAI官方客户端的开源实现&#xff0c;或者是…...

Loki‘s Insight:OpenClaw AI智能体本地调试与上下文可视化工具

1. 项目概述&#xff1a;为AI智能体打开一扇“观察窗”如果你和我一样&#xff0c;深度使用过像OpenClaw这类本地运行的AI智能体框架&#xff0c;那你一定经历过这样的困惑&#xff1a;我精心准备的记忆文件&#xff08;MEMORY.md&#xff09;、用户档案&#xff08;USER.md&am…...

Go语言错误处理:error接口与错误包装详解

Go语言错误处理&#xff1a;error接口与错误包装详解 1. Go语言错误处理哲学 Go语言采用显式错误处理的哲学&#xff0c;与其他语言的异常机制不同。在Go中&#xff0c;错误被视为一种普通的返回值&#xff0c;函数通过返回error类型来表示可能出现的错误。这种设计使得错误处理…...