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.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 | 如何绘制高端大气的分组矩阵图相关推荐
- 怎样用迅捷画图绘制高端大气的思维导图
绘制思维导图不仅是在工作中在学习中也有很大的帮助,可以让我们的思路更加的清楚明了,但是有的同事绘制的思维导图不管在外观还是内容都是十分精彩的,那怎样操作才可以制作出高端大气的思维导图呢?下面是分享的操 ...
- AUTH权限通用后台管理控制系统、阿里云UI高端大气
基于阿里云的前端UI框架,使用THINKPHP3.2.3开发的通用后台. 目前集成了权限管理和统计管理模块,代码优美,PHP支持PHP5---PHP7,完美高端大气. 开发语言:PHP 操作系统:跨平 ...
- word2vector数据集样式_这样做数据可视化驾驶舱,高端大气,一目了然,领导不点赞都难...
2020年了,数据可视化已经不是个新鲜词了,把数据以可视化图表的形式展示并没有多神奇,用Excel等传统的办公工具就可以轻松实现. 以前传统数据分析报告就是ppt里贴图表,再配上分析结论,这种形式的数 ...
- json符号解释大全_牛年汪姓男孩高端大气的名字大全
牛年汪姓男孩高端大气的名字大全 张桉宁起名分享 牛年汪姓男孩高端大气的名字大全:给男孩起名有很多的讲究,需要从多个方面考虑.牛年汪姓男孩如何起一个高端大气的好名字,是家长朋友们都十分重视的.给牛年的汪 ...
- 织梦高端大气响应式会员中心模板 自适应手机端
介绍: 织梦dedecms高端大气响应式会员中心模板 自适应手机端 UTF8+GBK 新开发的高端简单大气织梦会员中心,响应式自适应手机端,后台充值功能,可以对接宝等其他的第三方 网盘下载地址: ht ...
- 5 video关掉字幕选项_让PPT字幕滚动起来,一秒高端大气,赶紧码住!
大家好,这里是 和秋叶一起学PPT~ 今天小叶偷个懒(希望老板不要看到) 教大家快速制作PPT字幕滚动动画~ 这周接手了一个大项目:制作重要商业合作 PPT.为了让甲方爸爸们满意我处处小心,却在最后一 ...
- 如何设计出高端大气、有黑科技感的可视化大屏?
只要一提起可视化,很多人第一个想到的,肯定就是火得一塌糊涂的大屏了. 从我身边很多从事可视化的朋友来看,越来越多的公司都将可视化大屏作为企业数据工作展示的"高级手段"和" ...
- 高端大气通用企业介绍PPT模板-优页文档
模板介绍 高端大气通用企业介绍PPT模板-优页文档.一套,企业管理,企业介绍,幻灯片模板,内含蓝色,红色多种配色,扁平化风格设计,动态播放效果,精美实用. 希望下面这份精美的PPT模板能给你带来帮助, ...
- 这样做数据可视化驾驶舱,高端大气,一目了然,领导不点赞都难
2020年了,数据可视化已经不是个新鲜词了,把数据以可视化图表的形式展示并没有多神奇,用Excel等传统的办公工具就可以轻松实现. 以前传统数据分析报告就是ppt里贴图表,再配上分析结论,这种形式的数 ...
最新文章
- 讯飞语音识别_赛诺语音输入法报告 搜狗、讯飞、百度AI语音输入哪家强
- MCollective架构篇4-MCollective各种插件的部署及测试
- 详细盘点joomla1.5和2.5中那些常用的扩展
- 第五次会议记录:开始进一步需求分析,及初步分工
- 特征提取 notes
- C++ Primer 5th笔记(chap 17 标准库特殊设施)输出补白
- App后台开发运维和架构实践学习总结(4)——APP的注册和登录功能设计
- 《AutoCAD 2016中文版从入门到精通》——1.5 基本输入操作
- nested exception is java.lang.NoClassDefFoundError: org/codehaus/jettison/json/JSONObject异常的解决办法
- linux关机机器语言,Linux 核心源代码分析 - 第十章 开机 关机 [续二] [超星]...
- Windows自动更新API (1)
- Hyper-V常见故障汇总
- 动态链接库劫持--libc
- Windows开启 CPU 虚拟化 + 关闭 Hyper-V
- HTML的div作用
- 用神经网络实现语音分类
- Non-static method ‘selectUser(com.lsc.bean.admin)‘ cannot be referenced from a static context
- 开源:全球软件产业四大发展趋势之一(转)
- 东野圭吾梦幻花读后感_《梦幻花》小说在线阅读-东野圭吾
- 项目一_GoldenEye