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.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.5M,N,K     % 点数、维数、类数groupName % groupName=unique(group)tdl       % tiledlayoutendmethods% 输入点集、分类情况及参数列表function obj=pairplot(pntSet,group,varargin)% 存储点集、分类情况obj.pntSet=pntSet;if nargin<2obj.group=ones(size(obj.pntSet,1),1);elseobj.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,varargin{i});if any(tid)obj.(obj.arginList{tid})=varargin{i+1};endend% 获取M,N,K数据obj.M=size(pntSet,1);obj.N=size(pntSet,2);if ~iscell(group)obj.group=num2cell(num2str(group));endobj.groupName=unique(obj.group);obj.K=length(obj.groupName);% Label初始化if isempty(obj.Label)obj.Label{obj.N}='';for i=1:obj.N,obj.Label{i}=num2str(i);endend% 颜色列表初始化if isempty(obj.colorList)obj.colorList=lines(obj.K);endend% 绘制图像=========================================================function obj=draw(obj)if obj.verMatlab>=2021obj.tdl=tiledlayout(obj.N,obj.N);end% 循环绘图for i=1:obj.Nfor j=1:obj.N% 依据版本创建不同类型子图-----------------------------if obj.verMatlab<2021obj.axMat{i,j}=subplot(obj.N,obj.N,(i-1)*obj.N+j);elseobj.axMat{i,j}=nexttile((i-1)*obj.N+j);endif obj.verMatlab>=2017.5hold(obj.axMat{i,j},'on')elsehold onendif i==obj.N,obj.axMat{i,j}.XLabel.String=obj.Label{j};endif 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.KboolData=ismember(obj.group,obj.groupName{k});ttYData=tYData(boolData);ttXData=tXData(boolData);switch truecase i<j  % 上三角绘图-------------------------switch obj.UTypecase '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,:));endcase i==j % 对角线绘图------------------------- switch obj.ETypecase 'hist' obj.gpMat{i,j}.gobj{k}=histogram(ttYData,bin,'FaceColor',obj.colorList(k,:),'Normalization', 'probability');case 'line'[f,x]=ksdensity(ttYData);obj.gpMat{i,j}.gobj{k}=plot(x,f,'Color',obj.colorList(k,:),'LineWidth',1.5); case 'area'[f,x]=ksdensity(ttYData);obj.gpMat{i,j}.gobj{k}=area(x,f,'FaceColor',obj.colorList(k,:),'FaceAlpha',.9); case 'histcdf'obj.gpMat{i,j}.gobj{k}=histogram(ttYData,bin,'FaceColor',obj.colorList(k,:),'Normalization', 'cdf');case 'linecdf'[f,x]=ecdf(ttYData);obj.gpMat{i,j}.gobj{k}=plot(x,f,'Color',obj.colorList(k,:),'LineWidth',1.5); endcase i>j  % 下角线绘图-------------------------switch obj.LTypecase '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,:));endendendendendfor i=1:obj.Nobj.axMat{i,i}.XLim=obj.axMat{mod(i,obj.N)+1,i}.XLim;endend% 以下为常用坐标区域设置函数=======================================function obj=setFewTick(obj)           % 减少刻度数量for i=1:obj.Nfor j=1:obj.Nif i~=obj.N,obj.axMat{i,j}.XTickLabel='';endif j~=1,obj.axMat{i,j}.YTickLabel='';endendendendfunction tightAxes(obj)                % 减少子图间隙if obj.verMatlab<2021wh=0.78/obj.N;whd=0.88/obj.N;for i=1:obj.Nfor j=1:obj.Nobj.axMat{i,j}.Position=[0.08+(j-1)*whd,0.08+(obj.N-i)*whd,wh,wh];endendelseobj.tdl.TileSpacing='tight';obj.tdl.Padding='compact';endendfunction obj=setLabelSize(obj,fontSize)% 设置标签大小for i=1:obj.Nfor j=1:obj.Nif i==obj.N,obj.axMat{i,j}.XLabel.FontSize=fontSize;endif j==1,obj.axMat{i,j}.YLabel.FontSize=fontSize;endendendendfunction setLineWidth(obj,lineWidth) % 设置轴粗细for i=1:obj.N,for j=1:obj.N,obj.axMat{i,j}.LineWidth=lineWidth;end;endendfunction setFontName(obj,fontName)   % 设置字体for i=1:obj.N,for j=1:obj.N,obj.axMat{i,j}.FontName=fontName;end;endendfunction setBox(obj,state)           % 设置框状态(on\off)for i=1:obj.N,for j=1:obj.N,box(obj.axMat{i,j},state);end;endendfunction setGrid(obj,state)          % 设置网格状态(on\off)for i=1:obj.N,for j=1:obj.N,grid(obj.axMat{i,j},state);end;endendend
end

【链接】:https://pan.baidu.com/s/1OYg6_JcxP_8W603Bwqlj2A?pwd=slan
【提取码】:slan

MATLAB | 如何绘制高端大气的分组矩阵图相关推荐

  1. 怎样用迅捷画图绘制高端大气的思维导图

    绘制思维导图不仅是在工作中在学习中也有很大的帮助,可以让我们的思路更加的清楚明了,但是有的同事绘制的思维导图不管在外观还是内容都是十分精彩的,那怎样操作才可以制作出高端大气的思维导图呢?下面是分享的操 ...

  2. AUTH权限通用后台管理控制系统、阿里云UI高端大气

    基于阿里云的前端UI框架,使用THINKPHP3.2.3开发的通用后台. 目前集成了权限管理和统计管理模块,代码优美,PHP支持PHP5---PHP7,完美高端大气. 开发语言:PHP 操作系统:跨平 ...

  3. word2vector数据集样式_这样做数据可视化驾驶舱,高端大气,一目了然,领导不点赞都难...

    2020年了,数据可视化已经不是个新鲜词了,把数据以可视化图表的形式展示并没有多神奇,用Excel等传统的办公工具就可以轻松实现. 以前传统数据分析报告就是ppt里贴图表,再配上分析结论,这种形式的数 ...

  4. json符号解释大全_牛年汪姓男孩高端大气的名字大全

    牛年汪姓男孩高端大气的名字大全 张桉宁起名分享 牛年汪姓男孩高端大气的名字大全:给男孩起名有很多的讲究,需要从多个方面考虑.牛年汪姓男孩如何起一个高端大气的好名字,是家长朋友们都十分重视的.给牛年的汪 ...

  5. 织梦高端大气响应式会员中心模板 自适应手机端

    介绍: 织梦dedecms高端大气响应式会员中心模板 自适应手机端 UTF8+GBK 新开发的高端简单大气织梦会员中心,响应式自适应手机端,后台充值功能,可以对接宝等其他的第三方 网盘下载地址: ht ...

  6. 5 video关掉字幕选项_让PPT字幕滚动起来,一秒高端大气,赶紧码住!

    大家好,这里是 和秋叶一起学PPT~ 今天小叶偷个懒(希望老板不要看到) 教大家快速制作PPT字幕滚动动画~ 这周接手了一个大项目:制作重要商业合作 PPT.为了让甲方爸爸们满意我处处小心,却在最后一 ...

  7. 如何设计出高端大气、有黑科技感的可视化大屏?

    只要一提起可视化,很多人第一个想到的,肯定就是火得一塌糊涂的大屏了. 从我身边很多从事可视化的朋友来看,越来越多的公司都将可视化大屏作为企业数据工作展示的"高级手段"和" ...

  8. 高端大气通用企业介绍PPT模板-优页文档

    模板介绍 高端大气通用企业介绍PPT模板-优页文档.一套,企业管理,企业介绍,幻灯片模板,内含蓝色,红色多种配色,扁平化风格设计,动态播放效果,精美实用. 希望下面这份精美的PPT模板能给你带来帮助, ...

  9. 这样做数据可视化驾驶舱,高端大气,一目了然,领导不点赞都难

    2020年了,数据可视化已经不是个新鲜词了,把数据以可视化图表的形式展示并没有多神奇,用Excel等传统的办公工具就可以轻松实现. 以前传统数据分析报告就是ppt里贴图表,再配上分析结论,这种形式的数 ...

最新文章

  1. 讯飞语音识别_赛诺语音输入法报告 搜狗、讯飞、百度AI语音输入哪家强
  2. MCollective架构篇4-MCollective各种插件的部署及测试
  3. 详细盘点joomla1.5和2.5中那些常用的扩展
  4. 第五次会议记录:开始进一步需求分析,及初步分工
  5. 特征提取 notes
  6. C++ Primer 5th笔记(chap 17 标准库特殊设施)输出补白
  7. App后台开发运维和架构实践学习总结(4)——APP的注册和登录功能设计
  8. 《AutoCAD 2016中文版从入门到精通》——1.5 基本输入操作
  9. nested exception is java.lang.NoClassDefFoundError: org/codehaus/jettison/json/JSONObject异常的解决办法
  10. linux关机机器语言,Linux 核心源代码分析 - 第十章 开机 关机 [续二] [超星]...
  11. Windows自动更新API (1)
  12. Hyper-V常见故障汇总
  13. 动态链接库劫持--libc
  14. Windows开启 CPU 虚拟化 + 关闭 Hyper-V
  15. HTML的div作用
  16. 用神经网络实现语音分类
  17. Non-static method ‘selectUser(com.lsc.bean.admin)‘ cannot be referenced from a static context
  18. 开源:全球软件产业四大发展趋势之一(转)
  19. 东野圭吾梦幻花读后感_《梦幻花》小说在线阅读-东野圭吾
  20. 项目一_GoldenEye

热门文章

  1. 音视频入门(四)-JPEG压缩算法原理
  2. python是哪个人创造的文字_创造中国汉字的人是谁
  3. json 加密解密爬虫
  4. 渣渣渣变渣渣系列(6)
  5. PHPCMS V9新模板
  6. 捣蛋phpwind之WindFrameWork
  7. laydate 周_第13周动画数据周报|本王不愁嫁喜欢你的春夏秋冬火热上线
  8. 交换机光口对通注意事项
  9. Linux下密码恢复及免密登录
  10. 皮皮仔!在 vscode 里操作数据库~