您当前的位置: 首页 >  矩阵

slandarer

暂无认证

  • 0浏览

    0关注

    248博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

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

slandarer 发布时间:2022-06-01 17:58:12 ,浏览量:0

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.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            
关注
打赏
1664692598
查看更多评论
0.0466s