效果展示:
例如随机生成一组分组数据,在最后两行调用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.axMat{i,j}
的形式存储,而各个图形对象以obj.gpMat{i,j}.gobj{k}
的形式存储。
我们使用这篇推送用到的修饰器: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.axMat{i,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=2021
obj.tdl=tiledlayout(obj.N,obj.N);
end
% 循环绘图
for i=1:obj.N
for j=1:obj.N
% 依据版本创建不同类型子图-----------------------------
if obj.verMatlab=2017.5
hold(obj.axMat{i,j},'on')
else
hold on
end
if i==obj.N,obj.axMat{i,j}.XLabel.String=obj.Label{j};end
if j==1,obj.axMat{i,j}.YLabel.String=obj.Label{i};end
% 获取对应数据-----------------------------------------
tYData=obj.pntSet(:,i);
tXData=obj.pntSet(:,j);
bin=linspace(min(tXData),max(tXData),20);
% 循环绘制各个类---------------------------------------
for k=1:obj.K
boolData=ismember(obj.group,obj.groupName{k});
ttYData=tYData(boolData);
ttXData=tXData(boolData);
switch true
case ij % 下角线绘图-------------------------
switch obj.LType
case 'plot'
obj.gpMat{i,j}.gobj{k}=plot(ttXData,ttYData,'.','Color',obj.colorList(k,:));
case 'scatter'
obj.gpMat{i,j}.gobj{k}=scatter(ttXData,ttYData,15,'CData',obj.colorList(k,:));
end
end
end
end
end
for i=1:obj.N
obj.axMat{i,i}.XLim=obj.axMat{mod(i,obj.N)+1,i}.XLim;
end
end
% 以下为常用坐标区域设置函数=======================================
function obj=setFewTick(obj) % 减少刻度数量
for i=1:obj.N
for j=1:obj.N
if i~=obj.N,obj.axMat{i,j}.XTickLabel='';end
if j~=1,obj.axMat{i,j}.YTickLabel='';end
end
end
end
function tightAxes(obj) % 减少子图间隙
if obj.verMatlab
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【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脚手架写一个简单的页面?