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

Posted slandarer

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MATLAB | 全网唯一,三元相映射图绘制(三元相分级统计地图)相关的知识,希望对你有一定的参考价值。

示例


对上期的补充

本期文章名叫三元相映射图绘制,但不单单讲这一点,同时会对上一篇多元映射地图做出补充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:1
    if states(i).Name=="Alaska"||states(i).Name=="Hawaii"
        states(i)=[];
    end
end

faceColors=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,varargini);
    if any(tid)
        obj.(obj.arginListtid)=varargini+1;
    end
end
% =========================================================================
% 基础配色表
baseAtla1=[1,0,0;0,1,0;0,0,1];
baseAtla2=[0,211,166;211,152,255;233,164,67]./255;
baseAtla3=[249,3,252;252,242,8;2,251,249]./255;
baseAtla4=[215,0,102;0,137,52;3,79,162]./255;
baseAtla5=[243,180,0;180,102,0;0,0,0]./255;
baseAtla6=[31,5,94;128,128,128;180,0,0]./255;
if numel(obj.colorList)==1,atla=baseAtlaobj.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=[以上是关于MATLAB | 全网唯一,三元相映射图绘制(三元相分级统计地图)的主要内容,如果未能解决你的问题,请参考以下文章

MATLAB | 全网唯一,双变量及三变量映射图表的MATLAB绘制

MATLAB | 全网唯一,双变量及三变量映射图表的MATLAB绘制

如何根据三元相图画二元相图

MATLAB | 全网唯一,使用MATLAB绘制矩形树状图

MATLAB | 全网唯一,使用MATLAB绘制矩形树状图

MATLAB | 全网唯一,使用MATLAB绘制好看的韦恩图(venn)