MATLAB | 全网唯一,三元相映射图绘制(三元相分级统计地图)

news/2024/6/2 12:16:28/文章来源:https://blog.csdn.net/slandarer/article/details/126716456

示例


对上期的补充

本期文章名叫三元相映射图绘制,但不单单讲这一点,同时会对上一篇多元映射地图做出补充https://slandarer.blog.csdn.net/article/details/126702967:

上篇中可以绘制这样的三变量映射地图:

但这只是对多边形填色,有人问我如果是网格数据或者像素级别的数据该如何填色?实际上只要输入变量是三个同大小的矩阵就行,因此像素填色完全可以做到,本篇先对此做出解答,举个实例(这里也是懒得搜集数据,直接将经纬度及海拔作为映射变量):

代码中出现的multiVarMap3函数请见上篇文章:

% 导入数据并绘制贴图版地图
load korea5c
worldmap(korea5c,korea5cR);
koreaHdl=geoshow(korea5c,korea5cR,'DisplayType','texturemap');A=koreaHdl.XData;A=A(1:end-1,1:end-1);
B=koreaHdl.YData;B=B(1:end-1,1:end-1);
C=koreaHdl.CData;% % 调用工具函数生成图例和映射表
[CMapData,CMapHdl]=multiVarMap3(A,B,C,'colorList',1,'pieceNum',50);
koreaHdl.CData=CMapData;


三元相映射图绘制

使用基本说明

三元相映射图绘制函数multiVarMapTri基本使用方法和上期推送的multiVarMap3函数一模一样,

依旧是colorList代表配色,pieceNum代表颜色划分数量:

% 导入数据并绘制贴图版地图
load korea5c
worldmap(korea5c,korea5cR);
koreaHdl=geoshow(korea5c,korea5cR,'DisplayType','texturemap');A=koreaHdl.XData;A=A(1:end-1,1:end-1);
B=koreaHdl.YData;B=B(1:end-1,1:end-1);
C=koreaHdl.CData;% % 调用工具函数生成图例和映射表
[CMapData,CMapHdl]=multiVarMapTri(A,B,C,'colorList',6,'pieceNum',8);
koreaHdl.CData=CMapData;

图例可拖拽移动:

配色展示

colorList可以是基础配色编号1-6,或者是3x3大小的RGB颜色数组。

准备了六个基础配色,例如改用配色5:

% 导入数据并绘制贴图版地图
load korea5c
worldmap(korea5c,korea5cR);
koreaHdl=geoshow(korea5c,korea5cR,'DisplayType','texturemap');A=koreaHdl.XData;A=A(1:end-1,1:end-1);
B=koreaHdl.YData;B=B(1:end-1,1:end-1);
C=koreaHdl.CData;% % 调用工具函数生成图例和映射表
[CMapData,CMapHdl]=multiVarMapTri(A,B,C,'colorList',5,'pieceNum',8);
koreaHdl.CData=CMapData;


全部配色展示:

示例2多边形地图填色

axm=usamap("conus");states=shaperead("usastatelo.shp",'UseGeoCoords',true);
% 俩州离太远画不开,不要
for i=length(states):-1:1if states(i).Name=="Alaska"||states(i).Name=="Hawaii"states(i)=[];end
endfaceColors=makesymbolspec('Polygon',{'INDEX',[1 numel(states)],'FaceColor',...polcmap(numel(states))});
usaMap=geoshow(states, 'DisplayType','polygon','SymbolSpec', faceColors);% 不想去收集数据了,随便生成点随机数
A=rand(numel(states),1);
B=rand(numel(states),1);
C=rand(numel(states),1);% 调用工具函数生成图例和映射表
[CMapData,CMapHdl]=multiVarMapTri(A,B,C,'colorList',2,'pieceNum',8);
% 循环修改每个州颜色
for i=1:length(usaMap.Children)usaMap.Children(i).FaceColor=[CMapData(i,1,1),CMapData(i,1,2),CMapData(i,1,3)];
end 

示例3气泡图

x=1:20;
y=rand(1,20);
sz=rand(1,20);
BC=bubblechart(x,y,sz); % 不想去收集数据了,随便生成点随机数
A=rand(1,20);
B=rand(1,20);
C=rand(1,20);% 调用工具函数生成图例和映射表
[CMapData,CMapHdl]=multiVarMapTri(A,B,C,'colorList',2,'pieceNum',8);
BC.CData=[CMapData(:,:,1)',CMapData(:,:,2)',CMapData(:,:,3)']; 


三元相映射图完整代码

function [CMapData,CMapHdl]=multiVarMapTri(A,B,C,varargin) 
% @author : slandarer
% gzh  : slandarer随笔help multiVarMapTri
% =========================================================================
% 基本属性提取
obj.arginList={'colorList','pieceNum','varName','title'};
obj.colorList=1;
obj.pieceNum=6;
obj.varName={'var1','var2','var3'};
obj.title='ColorMap';
for i=1:2:(length(varargin)-1)tid=ismember(obj.arginList,varargin{i});if any(tid)obj.(obj.arginList{tid})=varargin{i+1};end
end
% =========================================================================
% 基础配色表
baseAtla{1}=[1,0,0;0,1,0;0,0,1];
baseAtla{2}=[0,211,166;211,152,255;233,164,67]./255;
baseAtla{3}=[249,3,252;252,242,8;2,251,249]./255;
baseAtla{4}=[215,0,102;0,137,52;3,79,162]./255;
baseAtla{5}=[243,180,0;180,102,0;0,0,0]./255;
baseAtla{6}=[31,5,94;128,128,128;180,0,0]./255;
if numel(obj.colorList)==1,atla=baseAtla{obj.colorList};end
% =========================================================================
% 数据处理及图例色卡数据构建
CMapData=getCMap3(A,B,C,atla,obj.pieceNum);function CMap=getCMap3(A,B,C,atla,n)nA=(A(:)-min(A(:)))./(max(A(:))-min(A(:)));nB=(B(:)-min(B(:)))./(max(B(:))-min(B(:)));nC=(C(:)-min(C(:)))./(max(C(:))-min(C(:)));nA=(ceil(nA.*n.*3)-1)./(n.*3-1);nB=(ceil(nB.*n.*3)-1)./(n.*3-1);nC=(ceil(nC.*n.*3)-1)./(n.*3-1);nA(nA<0)=0;nB(nB<0)=0;nC(nC<0)=0;ABC=[nA,nB,nC];ABC=ABC./sum(ABC,2);ABC(isnan(ABC))=1/3;colorAB=atla(1,:).*ABC(:,1)+...atla(2,:).*ABC(:,2)+...atla(3,:).*ABC(:,3);CMap=zeros([size(A),3]);CMap(:,:,1)=reshape(colorAB(:,1),size(A));CMap(:,:,2)=reshape(colorAB(:,2),size(A));CMap(:,:,3)=reshape(colorAB(:,3),size(A));end% =========================================================================
% 坐标区域初定位及修饰
ax1=gca;fig=ax1.Parent;
ax1Pos=ax1.Position;
ax2=axes('Parent',fig,'Position',[ax1Pos(1)+6/9*ax1Pos(3),...ax1Pos(2)+6/9*ax1Pos(4),ax1Pos(3)*2.5/9,ax1Pos(4)*2.5/9]);
ax1.UserData=1;
ax2.UserData=2;
ax2.XLim=[-.5,.5];
ax2.YLim=[-sqrt(3)/6,sqrt(3)/3.*1.3];
ax2.XTick=[];
ax2.YTick=[];
ax2.XColor='none';
ax2.YColor='none';
ax2.Color='none';
ax2.DataAspectRatio=[1,1,1];
ax2.FontName='Arial';
ax2.FontSize=9;
ax2.Title.String=obj.title;
ax2.Toolbar.Visible='off';
hold(ax2,'on');view(2);
% =========================================================================
% 图例中三元相图绘制
tt=[pi/2,pi/2+2*pi/3,pi/2+4*pi/3,pi/2];
tX=cos(tt)./sqrt(3);
tY=sin(tt)./sqrt(3);
plot(ax2,tX,tY,'Color',[0,0,0],'LineWidth',1.5)
YList=linspace(tY(1),tY(2),obj.pieceNum+1);
X0List=linspace(tX(1),tX(2),obj.pieceNum+1);
X1List=linspace(tX(1),tX(3),obj.pieceNum+1);
VList=zeros(round((obj.pieceNum+1)*(obj.pieceNum+2)/2),2);
for i=1:length(YList)tXList=linspace(X0List(i),X1List(i),i)';tYList=YList(i).*(ones(i,1));tN=round(i*(i-1)/2);VList((tN+1):(tN+i),:)=[tXList,tYList];
end
RList=zeros(obj.pieceNum*obj.pieceNum,3);
FList=zeros(obj.pieceNum*obj.pieceNum,3);n=1;
for i=2:length(YList)NLList=(round((i-1)*(i-2)/2)+1):(round((i-1)*(i-2)/2)+i-1);NList=(round(i*(i-1)/2)+1):(round(i*(i-1)/2)+i);for j=1:(i-1)FList(n,:)=[NList(j),NList(j+1),NLList(j)];RList(n,:)=[j-1,i-1-j,obj.pieceNum+1-i];n=n+1;end
end
for i=2:(length(YList)-1) NList=(round(i*(i-1)/2)+1):(round(i*(i-1)/2)+i);NNList=(round((i+1)*(i)/2)+1):(round((i+1)*(i)/2)+i+1);for j=1:(i-1)FList(n,:)=[NList(j),NList(j+1),NNList(j+1)];RList(n,:)=[j-1+1/3,i-1-j+1/3,obj.pieceNum+1-i-2/3];n=n+1;end
end
legendCMap=getCMap3(RList(:,1),RList(:,2),RList(:,3),atla,obj.pieceNum);
patch(ax2,'Faces',FList,'Vertices',VList,'CData',legendCMap,...'FaceColor','flat','EdgeColor','none')
text(ax2,cos(pi/2+2*pi/3).*0.65,sin(pi/2+2*pi/3).*0.8,obj.varName{1},'FontSize',11,'FontName','Arial','HorizontalAlignment','center')
text(ax2,cos(pi/2).*0.69,sin(pi/2).*0.69,obj.varName{2},'FontSize',11,'FontName','Arial','HorizontalAlignment','center')
text(ax2,cos(pi/2-2*pi/3).*0.68,sin(pi/2-2*pi/3).*0.8,obj.varName{3},'FontSize',11,'FontName','Arial','HorizontalAlignment','center')text(ax2,cos(-pi/2).*0.4,sin(-pi/2).*0.4,'→','FontSize',15,'FontName','Arial','HorizontalAlignment','center')
text(ax2,cos(-pi/2+2*pi/3).*0.4,sin(-pi/2+2*pi/3).*0.4,'→','FontSize',15,'FontName','Arial','HorizontalAlignment','center','Rotation',120)
text(ax2,cos(-pi/2-2*pi/3).*0.4,sin(-pi/2-2*pi/3).*0.4,'→','FontSize',15,'FontName','Arial','HorizontalAlignment','center','Rotation',-120)% 图例拖动回调
set(fig,'WindowButtonDownFcn',@BtnDownFunc, ...'WindowButtonUpFcn',@BtnUpFunc, ...'WindowButtonMotionFcn',@BtnMotionFunc, ...'KeyPressFcn',@keyFunc)
selectedAx=false;% 选择图例时的回调function BtnDownFunc(~,~)taxes=get(fig,'currentAxes');if taxes.UserData==2selectedAx=true;endend% 松开图例时的回调function BtnUpFunc(~,~)selectedAx=false;set(fig,'currentAxes',ax1)end% 选择图例并拖动时的回调function BtnMotionFunc(~,~)if selectedAxtpos=get(fig,'CurrentPoint');figPos=fig.Position;normPos=tpos./figPos(3:4);ax2.Position(1:2)=-ax2.Position(3:4)./2+normPos;endend
set(fig,'currentAxes',ax1)
CMapHdl=ax2;
end

如果有用请留个叭~

未经允许本代码请勿作商业用途,引用的话可以引用我file exchange上的链接,可使用如下格式:

Zhaoxu Liu (2022). Ternary phase map 三元相映射图 (https://www.mathworks.com/matlabcentral/fileexchange/117195-ternary-phase-map), MATLAB Central File Exchange. 检索来源 2022/9/5.

若转载请保留以上file exchange链接及本文链接!!!

全部m文件及素材包获取:
链接:https://pan.baidu.com/s/1V9eVKqbk2uQQDCMV6BggHQ?pwd=slan
提取码:slan

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

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

相关文章

Vue学习之--------路由(Router)的基本使用(1)(2022/9/5)

理解&#xff1a; 一个路由&#xff08;route&#xff09;就是一组映射关系&#xff08;key - value&#xff09;&#xff0c;多个路由需要路由器&#xff08;router&#xff09;进行管理。前端路由&#xff1a;key是路径&#xff0c;value是组件。控制页面的跳转 文章目录1、基…

01-linux基础命令

1、常用命令 常用Linux命令的基本使用序号命令对应英文作用01 ls list 查看当前目录下的内容02 pwd print working derectory 查看当前所在文件夹03 cd [目录名] change directory 切换文件夹04 touch [文件名] touch 如果文件不存在, 新建文件05 mkdir [目录名] make director…

【JavaSE】多线程篇(三)用户线程、守护线程与线程的7大状态

&#x1f481; 个人主页&#xff1a;黄小黄的博客主页 ❤️ 支持我&#xff1a;&#x1f44d; 点赞 &#x1f337; 收藏 &#x1f918;关注 &#x1f38f; 格言&#xff1a;All miracles start from sometime somewhere, make it right now. 本文来自专栏&#xff1a;JavaSE从入…

关于使用@Scheduled()注解造成的多任务冲突问题解决

问题描述&#xff1a; 2022-08-18 01:59:00.001 INFO [irms-transfer-service,,,] 15 --- [ scheduling-1] c.s.i.t.service.impl.ProjectManageSvc : -------定时扫描导出任务开启------- 2022-08-18 01:59:00.004 INFO [irms-transfer-service,,,] 15 --- [ schedu…

如何查看navicat已连接用户的密码

1:从注册表中查看加密后的密码。1.1:windows键+r,输入 regedit1.2:在注册表中找到 \HKEY_CURRENT_USER\SOFTWARE\PremiumSoft\navicat\servers 并找到 UserName 即 账号1.3:从上面步骤中,打开注册表、并找到如下图片中的密码栏:Pwd(加密的密码)2:解密密码,打开在线工…

React 应用程序中的简单路由

React 应用程序中的简单路由一个简单的、可扩展的路由解决方案可以满足您的应用程序的所有需求,而不会引入像 React-Router 这样的工具所提供的复杂性。 进入: 浏览器的 窗口位置 目的。 它提供了为您的应用程序创建一个简单的“路由”系统所需的一切。例如,这里是什么 窗口…

【Selenium Other】一键杀死进程 进程清理大师

前言 有位读者留言&#xff0c;遇到了一件两难全的事儿。在关闭Python使用os模块执行cmd命令调用的chromedriver驱动打开的chrome浏览器时&#xff0c;有以下问题~ 使用driver.quit()退出浏览器&#xff0c;chromedriver.exe进程退出&#xff0c;关闭没有窗口使用driver.close(…

2021年中青杯B题港珠澳大桥桥梁设计与安全策略数学建模全过程文档及程序

港珠澳大桥桥梁设计与安全策略 原题再现 “港珠澳大桥是国家工程、国之重器&#xff0c;其建设创下多项世界之最&#xff0c;非常了不起&#xff0c;体现了一个国家逢山开路、遇水架桥的奋斗精神&#xff0c;体现了我国综合国力、自主创新能力&#xff0c;体现了勇创世界一流的…

nuxt vue 按住鼠标左右滑动方案收集

目录前言vue-dragscrollvuescroll自己写个指令参考前言 最近在做PC端网页左右滑动&#xff0c;找到以下3种方案&#xff0c;做个记录。 vue-dragscroll 官方文档&#xff1a;https://vue-dragscroll.donfalcon.com/安装&#xff08;注意版本&#xff09; npm install vue-d…

VUE 如何将父组件中的数据传递到子组件中

在我们的项目中我们使用 axios 进行异步调用。 因为异步调用的问题,如果我不采取手段,子页面没有办法获得父页面中的数据,页面将会显示为 没有数据。问题和解决 这个问题的原因就是子组件在初始化的时候,父组件还没有获得数据。 可以使用的方法是 v-if 进行判断。 对比上面…

[数据结构]~栈和队列(0-1)

前言 作者&#xff1a;小蜗牛向前冲 名言&#xff1a;我可以接收失败&#xff0c;但我不能接收放弃 如果觉的博主的文章还不错的话&#xff0c;还请点赞&#xff0c;收藏&#xff0c;关注&#x1f440;支持博主。如果发现有问题的地方欢迎❀大家在评论区指正。 目录 一 “栈…

3D激光线扫相机与结构光相机的区别

激光线扫相机 激光相机基于三角测量&#xff0c;可精确捕获3D形状(数百万个点)。更精确地说&#xff0c;它们的工作原理是将激光点或激光线投射到物体上&#xff0c;然后用传感器捕获其反射。由于传感器的位置与激光源的距离已知&#xff0c;因此可以通过计算激光的反射角来进…

Bus:消息总线

Spring Cloud Bus:消息总线 一、消息总线简介 1. 什么是Spring Cloud Bus ​ Spring Cloud Bus集成了市面上常见的RabbitMQ和Kafka等消息代理。其会连接微服务系统中所有拥有Bus总线机制的节点,当有数据变更的时候,会通过消息中间件使用消息广播的方式通知所有的微服务节…

57所学校195个小组409名学生

本次大赛共有57所学校195个小组409名学生参与,经过预赛和初赛选拔,94个小组进入决赛。决赛于7月5日在上海世外教育附属姚江书院举行。大赛分为五个赛事:月球探索创新比赛、火星家园创意比赛、未来太空工程挑战比赛、北斗创造美好生活创意比赛、星球资源运输挑战比赛。月球探…

docker的端口映射+存储卷

docker的端口映射 前置知识:IP地址的分类1 IP地址分类:(5类)2 A类地址:3 (1)第1字节为网络地址,其它3个字节为主机地址;4 (2)地址范围:1.0.0.1—126.155.255.254;5 (3)10.X.X.X是私有地址,127.X.X.X是保留地址;6 7 B类地址:8 …

高斯消去法(Gauss-Jordan方法)的Python实现

矩阵分析与应用的Gauss-Jordan法的Python程序高斯消去法的改进形式为Gauss-Jordan Elimination Method,要求每一行的主元素所在列元素全部消去为0,除了主元素本身。区别如下:代码实现如下:# -*- coding: utf-8 -*- # @Author : ZhaoKe # @Time : 2022-09-05 23:34 from typ…

[Go] Pointer

var name stringvar namePointer *string // Pointername = "Beyonce"namePointer = &name // Assign a Pointerfmt.Println("Name: ", name)fmt.Println("Name *: ", *namePointer) // Need to add * to get value

PyScript

PyScript 为 99% 的人编程脚本? Python和Javascript?? 嗯,是的,也不是。PyScript 是一个框架,允许用户在 Pyodide, WASM 和现代网络技术。它可以帮助您使用 Python 构建 Web 应用程序,无论是否使用 Javascript。 PyScript 的目标之一是让 Web 开发成为任何想要学习编码的…

使用 React Router V6 了解会话管理

使用 React Router V6 了解会话管理Photo by 约书亚阿拉贡 on 不飞溅 React 根本不需要任何介绍,在这里我不打算描述它是什么以及如何工作的。我试图更详细地介绍 React 应用程序架构的主要方面,这将在未来帮助您快速构建一个易于扩展的项目。我们已经准确地开发了使用 Rea…

JAVA和JVM和JDK和JRE和JAVA SE 是什么? 他们有什么区别? 怎么区分 编程下哪个?

现在是北京时间2022年9月5日 17:02分 我在上海某211 大学的机房里 首先 先不讲技术 先讲讲我自己最近的生活 如果你想看技术部分 你可以直接跳过。 最近呢 成都疫情稍微有点严重 但是政府直接就让封城了 导致我的很多朋友和亲戚都被关在家里 所以这段时间呢 心情也不是很好 …