应粉丝要求写了一个多变量映射图绘制的工具函数,依旧全网唯一hiahiahia,一般图像只有一个变量需要映射到颜色,其他变量映射到点的大小啥的,但这两个变量之间的联系就没有那么直观,而且如果变量更多例如三个变量就比较难找到表现形式,但是,多变量映射图可以解决这些问题。
本篇先讲解双变量映射图表绘制再讲解三变量映射图表绘制。两个工具函数由于过长均放在文末。
示例图需要A,B两个完全相同大小的数值矩阵,通过
[CMapData,CMapHdl]=multiVarMap2(A,B)
的格式调用双变量映射图绘制工具函数,返回值为一个CMapData
RGB颜色数组,用于给图形对象赋予颜色,以及一个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);
本文展示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
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];
可以随便拖拽、旋转:
随机生成颜色太乱,因此第二个图把所有数据都从大到小排列,生成可一组不太乱的随机数据。
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
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
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?