MATLAB | 如何绘制高端大气的分组矩阵图
Posted slandarer
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MATLAB | 如何绘制高端大气的分组矩阵图相关的知识,希望对你有一定的参考价值。
MATLAB 绘制分组矩阵图
效果展示:
工具函数放在最后 ! ! ! !
工具函数放在最后 ! ! ! !
工具函数放在最后 ! ! ! !
基本使用
例如随机生成一组分组数据,在最后两行调用pairplot
函数:
% 随机生成数据
pntSet1=mvnrnd([0,20,0,10],eye(4),50);
pntSet2=mvnrnd([10,5,15,0],eye(4).*.5,50);
pntSet3=mvnrnd([10,15,0,0],eye(4).*[1,1,2,1],50);
% 分组
pntSet=[pntSet1;pntSet2;pntSet3];
group=[ones(50,1)*1;ones(50,1)*2;ones(50,1)*3];
% 绘图
pp=pairplot(pntSet,group);
pp=pp.draw();
为了绘图更加好看,后面使用fisher.mat
中的数据绘图,该数据第一列即为分组情况:(该数据集已放入压缩包,请回复文末关键词获取)
% 导入数据
load Fisher.mat
group=Fisher(:,1);
pntSet=Fisher(:,2:end);
% 绘图
pp=pairplot(pntSet,group);
pp=pp.draw();
属性设置方式
各个属性在构造时候使用以及在后期设置属性效果相同,即以下两种设置方式效果完全一致:
设置对角线图像格式(构造时设置)
pp=pairplot(pntSet,group,'EType','area');
pp=pp.draw();
设置对角线图像格式(属性设置)
pp=pairplot(pntSet,group);
pp.EType='area';
pp=pp.draw();
设置颜色
pp=pairplot(pntSet,group);
pp.colorList=[119,69,133;56,108,155;33,160,122]./255;
pp=pp.draw();
主要属性
-
UType、LType 上三角绘图格式、下三角绘图格式,支持格式有:‘plot’(默认) \\ ‘scatter’
-
EType 对角线绘图格式,支持格式有:‘hist’(默认) \\ ‘line’ \\ ‘area’ \\ ‘histcdf’ \\ ‘linecdf’
-
Label 标签名称,字符串元胞数组格式
-
colorList 颜色列表,Kx3大小RGB数值矩阵,数值0~1范围
主要方法
- setFewTick() 减少刻度,即仅保留左下角坐标区的刻度
- tightAxes() 减少子图空隙
- setLabelSize(fontSize) 设置标签大小
- setLineWidth(lineWidth) 设置轴粗细
- setFontName(fontName) 设置字体
- setBox(state) 设置框状态(on\\off)
- setGrid(state) 设置网格状态(on\\off)
举个实例:
load Fisher.mat
group=Fisher(:,1);
pntSet=Fisher(:,2:end);
fig=gcf;
fig.Position=[100,100,850,600];
pp=pairplot(pntSet,group,'UType','scatter');
pp.Label='PW', 'PL', 'SW', 'SL';% 设置标签
pp.verMatlab=2020;% 设置为老版本axes格式
pp=pp.draw(); % 绘图
pp.setFewTick(); % 减少刻度标签数量
pp.setBox('on'); % 开启框
pp.setGrid('on');% 开启网格
pp.setFontName('Cambria');% 更改字体,Cambria只支持英文
pp.setLabelSize(14); % 更改标签文字大小
pp.tightAxes(); % 减少子图空隙
与坐标区域修饰器联动
绘制出的对象可做很多更细致的修饰,各个坐标区域以obj.axMati,j
的形式存储,而各个图形对象以obj.gpMati,j.gobjk
的形式存储。
我们使用这篇推送用到的修饰器:MATLAB | 一行代码让你的绘图背景变得逼格满满
需要注意的是,为了适应版本,对于R2021a之前的版本,本工具使用subplot
创建的坐标区域父类为Figure
,而对于R2021a及之后的版本,本工具使用nexttile
创建的坐标区域并不直接以Figure
作为父类,而是有TiledChartLayout
这个中间父类,而修饰器并不会的ui中间父类进行修饰,因而如果版本比较新,则需要设置该工具的隐藏属性:verMatlab
属性以下给出实例:
load Fisher.mat
group=Fisher(:,1);
pntSet=Fisher(:,2:end);
pp=pairplot(pntSet,group);
pp.Label='PW', 'PL', 'SW', 'SL';% 设置标签
pp.verMatlab=2020;% 设置为老版本axes格式
pp=pp.draw(); % 绘图
pp.setFewTick(); % 减少刻度标签数量
pp.setBox('on'); % 开启框
pp.setGrid('on');% 开启网格
pp.setFontName('Cambria');% 更改字体,Cambria只支持英文
pp.setLabelSize(14); % 更改标签文字大小
% pp.tightAxes(); % 减少子图空隙
% 循环调用prettyAxes修饰
for i=1:pp.N
for j=1:pp.N
ax=pp.axMati,j;
prettyAxes(ax).dark2()
end
end
另外,由于特殊的函数绘制方式,目前只支持’gbase’ \\ ‘gbase2’ \\ ‘ggray’ \\ ‘ggray2’ \\ ‘dark’ \\ ‘dark2’ 格式的风格修饰:
工具完整类
classdef pairplot
% @author : slandarer
% 公众号 : slandarer随笔
% 知乎 : hikari
%
% 使用实例:
% ==========================================================
% 实例1:
% ----------------------------------------------------------
% % 随机生成数据
% pntSet1=mvnrnd([0,20,0,10],eye(4),50);
% pntSet2=mvnrnd([10,5,15,0],eye(4).*.5,50);
% pntSet3=mvnrnd([10,15,0,0],eye(4).*[1,1,2,1],50);
% % 分组
% pntSet=[pntSet1;pntSet2;pntSet3];
% group=[ones(50,1)*1;ones(50,1)*2;ones(50,1)*3];
% % 绘图
% pp=pairplot(pntSet,group);
% pp=pp.draw(); % 绘图
% ==========================================================
% 实例2:
% ----------------------------------------------------------
% % 随机生成数据
% pntSet1=mvnrnd([0,20,0,10],eye(4),50);
% pntSet2=mvnrnd([10,5,15,0],eye(4).*.5,50);
% pntSet3=mvnrnd([10,15,0,0],eye(4).*[1,1,2,1],50);
% % 分组
% pntSet=[pntSet1;pntSet2;pntSet3];
% group=[ones(50,1)*1;ones(50,1)*2;ones(50,1)*3];
% % 绘图
% pp=pairplot(pntSet,group);
% pp.Label='PW', 'PL', 'SW', 'SL';% 设置标签
% pp.verMatlab=2020;% 设置为老版本axes格式
% pp=pp.draw(); % 绘图
%
% pp.setFewTick(); % 减少刻度标签数量
% pp.setBox('on'); % 开启框
% pp.setGrid('on');% 开启网格
% pp.setFontName('Cambria');% 更改字体,Cambria只支持英文
% pp.setLabelSize(14); % 更改标签文字大小
% pp.tightAxes(); % 减少子图空隙
% ==========================================================
% 实例3:
% ----------------------------------------------------------
% % 导入数据
% load Fisher.mat
% group=Fisher(:,1);
% pntSet=Fisher(:,2:end);
% % 绘图
% pp=pairplot(pntSet,group);
% pp=pp.draw(); % 绘图
properties
% 其他输入属性名称列表
arginList='Label','colorList','UType','LType','EType'
% -----------------------------------------------------------------
pntSet % MxN矩阵 | 数据集:m为点数,n为维数
group % Mx1矩阵或元胞数组 | 分类情况
Label=; % 1xN元胞数组 | 各维度名称
colorList=[]; % Kx3矩阵 | 各类颜色
UType='plot'; % 字符串 | 矩阵图上三角绘图格式'plot'\\'scatter'
LType='plot'; % 字符串 | 矩阵图下三角绘图格式'plot'\\'scatter'
EType='hist' % 字符串 | 矩阵图对角线绘图格式'hist'\\'line'\\'area'
% \\'histcdf'\\'linecdf'
% -----------------------------------------------------------------
axMat % NxN坐标区域矩阵 | 若版本为R2021a及之后版本
% | 使用tiledlayout函数创建坐标区域
% | 否则使用subplot函数创建坐标区域
gpMat % (NxN).(Kx1)图形对象结构体
% -----------------------------------------------------------------
verMatlab % MATLAB 版本: R2021a显示为2021,R2021b显示为2021.5
M,N,K % 点数、维数、类数
groupName % groupName=unique(group)
tdl % tiledlayout
end
methods
% 输入点集、分类情况及参数列表
function obj=pairplot(pntSet,group,varargin)
% 存储点集、分类情况
obj.pntSet=pntSet;
if nargin<2
obj.group=ones(size(obj.pntSet,1),1);
else
obj.group=group;
end
% 获取版本信息
tver=version('-release');
obj.verMatlab=str2double(tver(1:4))+(abs(tver(5))-abs('a'))/2;
% 获取其他信息
for i=1:(length(varargin)-1)
tid=ismember(obj.arginList,varargini);
if any(tid)
obj.(obj.arginListtid)=varargini+1;
end
end
% 获取M,N,K数据
obj.M=size(pntSet,1);
obj.N=size(pntSet,2);
if ~iscell(group)
obj.group=num2cell(num2str(group));
end
obj.groupName=unique(obj.group);
obj.K=length(obj.groupName);
% Label初始化
if isempty(obj.Label)
obj以上是关于MATLAB | 如何绘制高端大气的分组矩阵图的主要内容,如果未能解决你的问题,请参考以下文章