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 | 如何绘制高端大气的分组矩阵图的主要内容,如果未能解决你的问题,请参考以下文章

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

matlab散点矩阵图

如何在MATLAB中将3列矩阵绘制为颜色图?

MATLAB | 如何使用MATLAB绘制雷达图(蜘蛛图)

MATLAB | 如何使用MATLAB绘制雷达图(蜘蛛图)

MATLAB | 好看的相关系数矩阵图绘制