您当前的位置: 首页 >  matlab

slandarer

暂无认证

  • 0浏览

    0关注

    248博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

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

slandarer 发布时间:2022-09-05 12:58:57 ,浏览量:0

应粉丝要求写了一个多变量映射图绘制的工具函数,依旧全网唯一hiahiahia,一般图像只有一个变量需要映射到颜色,其他变量映射到点的大小啥的,但这两个变量之间的联系就没有那么直观,而且如果变量更多例如三个变量就比较难找到表现形式,但是,多变量映射图可以解决这些问题。

本篇先讲解双变量映射图表绘制再讲解三变量映射图表绘制。两个工具函数由于过长均放在文末。

示例图

双变量映射图表 输入输出说明

需要A,B两个完全相同大小的数值矩阵,通过

[CMapData,CMapHdl]=multiVarMap2(A,B)

的格式调用双变量映射图绘制工具函数,返回值为一个CMapDataRGB颜色数组,用于给图形对象赋予颜色,以及一个CMapHdl图例。

基本使用

这里第一个例子是一个网格数据,multi2_3.mat中存储着变量X1,X2,A,B,C这里只用AB数据,分别是当前格点属于类A和B的概率,简单编写函数如下:

multiData=load('multi2_3.mat');
X1=multiData.X1;
X2=multiData.X2;
A=multiData.A;
B=multiData.B;

% 先绘制一个没有赋予颜色的图形
surfHdl=surf(X1,X2,zeros(size(X1)),'EdgeColor','none');
hold on;view(2);axis tight

% 调用工具函数生成图例和映射表
[CMapData,CMapHdl]=multiVarMap2(A,B); 
set(surfHdl,'CData',CMapData);

颜色划分

上面每个变量颜色划分了四段,我们可以调整pieceNum属性划分更多段颜色,例如分成8段:

multiData=load('multi2_3.mat');
X1=multiData.X1;
X2=multiData.X2;
A=multiData.A;
B=multiData.B;

% 先绘制一个没有赋予颜色的图形
surfHdl=surf(X1,X2,zeros(size(X1)),'EdgeColor','none');
hold on;view(2);axis tight

% 调用工具函数生成图例和映射表
[CMapData,CMapHdl]=multiVarMap2(A,B,'pieceNum',8); 
set(surfHdl,'CData',CMapData);

其他配色

们可以调整colorList属性调整配色,需要4x3大小的RGB数组,分别代表左下,右下,左上,右上的颜色,当然函数内置了12种默认配色,通过1-12的编号调用:

multiData=load('multi2_3.mat');
X1=multiData.X1;
X2=multiData.X2;
A=multiData.A;
B=multiData.B;

% 先绘制一个没有赋予颜色的图形
surfHdl=surf(X1,X2,zeros(size(X1)),'EdgeColor','none');
hold on;view(2);axis tight

% 调用工具函数生成图例和映射表
[CMapData,CMapHdl]=multiVarMap2(A,B,'pieceNum',8,'colorList',10); 
set(surfHdl,'CData',CMapData);

全部配色展示:

图例移动

可以随便拖拽:

修改变量名和标题
multiData=load('multi2_3.mat');
X1=multiData.X1;
X2=multiData.X2;
A=multiData.A;
B=multiData.B;

% 先绘制一个没有赋予颜色的图形
surfHdl=surf(X1,X2,zeros(size(X1)),'EdgeColor','none');
hold on;view(2);axis tight

% 调用工具函数生成图例和映射表
[CMapData,CMapHdl]=multiVarMap2(A,B,'pieceNum',8,'colorList',10,'title','XXXXX','varName',{'AAAAA','BBBBB'}); 
set(surfHdl,'CData',CMapData);

三维绘图

不管二维还是三维图例都可以添加

multiData=load('multi2_3.mat');
X1=multiData.X1;
X2=multiData.X2;
A=multiData.A;
B=multiData.B;

% 先绘制一个没有赋予颜色的图形
surfHdl=surf(X1,X2,max(A,B),'EdgeColor','none');
hold on;view(3);axis tight

% 调用工具函数生成图例和映射表
[CMapData,CMapHdl]=multiVarMap2(A,B,'colorList',10,'pieceNum',8);
set(surfHdl,'CData',CMapData);

示例2地图绘制

本文展示mapping toolbox绘制的图双变量映射,因此需要提前安装mapping toolbox工具箱,当然其他地图绘制工具箱绘制的图用本文的双变量映射也差不多,以下内容懒得收集数据,于是随便生成了一些数据:

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);

% 调用工具函数生成图例和映射表
[CMapData,CMapHdl]=multiVarMap2(A,B,'colorList',11,'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);


% 调用工具函数生成图例和映射表
[CMapData,CMapHdl]=multiVarMap2(A,B,'colorList',10,'pieceNum',8);
BC.CData=[CMapData(:,:,1)',CMapData(:,:,2)',CMapData(:,:,3)'];

三变量映射图表

使用方式和双变量映射区别不大:

multiData=load('multi2_3.mat');
X1=multiData.X1;
X2=multiData.X2;
A=multiData.A;
B=multiData.B;
C=multiData.C;

% 先绘制一个没有赋予颜色的图形
surfHdl=surf(X1,X2,zeros(size(X1)),'EdgeColor','none');
hold on;view(2);axis tight

% 调用工具函数生成图例和映射表
[CMapData,CMapHdl]=multiVarMap3(A,B,C,'colorList',1,'pieceNum',8);
set(surfHdl,'CData',CMapData);

其他配色

只准备了俩配色,以下内容因为画完后背景色和图例文字色相同因此修改了图例文本颜色:

multiData=load('multi2_3.mat');
X1=multiData.X1;
X2=multiData.X2;
A=multiData.A;
B=multiData.B;
C=multiData.C;

% 先绘制一个没有赋予颜色的图形
surfHdl=surf(X1,X2,zeros(size(X1)),'EdgeColor','none');
hold on;view(2);axis tight

% 调用工具函数生成图例和映射表
[CMapData,CMapHdl]=multiVarMap3(A,B,C,'colorList',2,'pieceNum',8);
set(surfHdl,'CData',CMapData);
CMapHdl.XColor=[1,1,1];
CMapHdl.YColor=[1,1,1];
CMapHdl.ZColor=[1,1,1];
CMapHdl.Title.Color=[1,1,1];

图例移动

可以随便拖拽、旋转:

示例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=sort(rand(numel(states),1));
B=sort(rand(numel(states),1));
C=sort(rand(numel(states),1));

% A=rand(numel(states),1);
% B=rand(numel(states),1);
% C=rand(numel(states),1);

% 调用工具函数生成图例和映射表
[CMapData,CMapHdl]=multiVarMap3(A,B,C,'colorList',1,'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]=multiVarMap3(A,B,C,'colorList',1,'pieceNum',8);
BC.CData=[CMapData(:,:,1)',CMapData(:,:,2)',CMapData(:,:,3)'];

工具函数完整代码 双变量
function [CMapData,CMapHdl]=multiVarMap2(A,B,varargin) 
% @author : slandarer
% gzh  : slandarer随笔
help multiVarMap2
% colorList应为4x3大小RGB数组
% [R1,G1,B1;R2,G2,B2;R3,B3,G3;R4,G4,B4]
% 分别对应图例左下,右下,左上,右上的颜色
% 或数值编号1-12

% =========================================================================
% 基本属性提取
obj.arginList={'colorList','pieceNum','varName','title'};
obj.colorList=1;
obj.pieceNum=4;
obj.varName={'var1','var2'};
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}=[233,233,233;201, 90, 90;100,173,191; 86, 64, 71]./255;
baseAtla{2}=[249,244,248;139,182,224;235,130,144;122,123,171]./255;
baseAtla{3}=[243,243,243;140,227,176;231,164,209;124,143,176]./255;
baseAtla{4}=[233,233,233;201,180, 90;154,115,176;129, 76, 51]./255;
baseAtla{5}=[222,222,222;  0,110,175;205,  0, 31; 74, 33, 76]./255;
baseAtla{6}=[233,233,233;108,132,182;116,175,129; 37, 90, 91]./255;
baseAtla{7}=[233,233,233; 89,201,201;191,100,173; 56, 71,149]./255;
baseAtla{8}=[243,243,243; 79,158,195;243,180,  0; 40, 40, 40]./255;
baseAtla{9}=[233,231,242; 78,174,209;223, 78,167; 37,19,139]./255;
baseAtla{10}=[227,228,223;127,135,124; 57,120,164; 20, 72, 83]./255;
baseAtla{11}=[243,232,156;248,161,127;207,102,148; 92, 82,166]./255;
baseAtla{12}=[248,225,152;181,167,124;108,119,149; 65, 92,170]./255;

if numel(obj.colorList)==1,atla=baseAtla{obj.colorList};end
% =========================================================================
% 数据处理及图例色卡数据构建
% nX1=X1(:);nX2=X2(:);
CMapData=getCMap(A,B,atla,obj.pieceNum);
    function CMap=getCMap(A,B,atla,n)
        nA=(A(:)-min(A(:)))./(max(A(:))-min(A(:)));
        nB=(B(:)-min(B(:)))./(max(B(:))-min(B(:)));
        nA=(ceil(nA.*n)-1)./(n-1);nB=(ceil(nB.*n)-1)./(n-1);
        nA(nA            
关注
打赏
1664692598
查看更多评论
0.0446s