• MATLAB | 如何绘制二维散点主方向直方图


    简简单单画个二维散点图主方向上的直方图:

    工具函数

    输入nx2大小的数组,返回以下四个图形对象:

    • H1: ‘数据点’
    • H2: ‘主方向’
    • H3: ‘数据范围’
    • H4: ‘统计图’
    function [H1,H2,H3,H4]=PCA2Hist(X,varargin)
    % H1: '数据点'
    % H2: '主方向'
    % H3: '数据范围'
    % H4: '统计图'
    
    % PCA-Hist
    % rng(12)
    hold on
    H1=scatter(X(:,1),X(:,2),'x','LineWidth',2,varargin{:});
    
    
    % 求主方向
    Xmean=mean(X);
    X0=X-Xmean;
    covMat=(X0.')*X0./(size(X,1)-1);
    [V,~]=eigs(covMat,1);
    V=V.*sign(V(1));
    Vc=[V(2);-V(1)];
    Lp=max(X0*V);
    Ln=min(X0*V);
    Ll=max(X0*Vc);
    Lr=min(X0*Vc);
    
    % 绘制统计图
    H2=plot(Xmean(1)+[Lp,Ln].*V(1).*1.05,Xmean(2)+[Lp,Ln].*V(2).*1.05,'Color',[H1.CData./5,.8],'LineStyle','-.','LineWidth',1.5);
    H3=fill(Xmean(1)+[Lp,Lp,Ln,Ln].*V(1).*1.05+[Ll,Lr,Lr,Ll].*Vc(1).*1.05,...
         Xmean(2)+[Lp,Lp,Ln,Ln].*V(2).*1.05+[Ll,Lr,Lr,Ll].*Vc(2).*1.05,... 
        H1.CData,'FaceAlpha',.15,'EdgeColor','none');
    
    histHdl=histogram(X0*Vc,'BinEdges',linspace(Lr,Ll,13),'Visible','off');
    maxValue=max(histHdl.Values);
    for i=1:histHdl.NumBins
        H4(i)=fill(Xmean(1)+[histHdl.BinEdges(i).*Vc(1)+Lp.*V(1).*1.05,...
            histHdl.BinEdges(i).*Vc(1)+Lp.*V(1).*1.05+histHdl.Values(i).*Lp.*V(1).*0.5./maxValue,...
            histHdl.BinEdges(i+1).*Vc(1)+Lp.*V(1).*1.05+histHdl.Values(i).*Lp.*V(1).*0.5./maxValue,...
            histHdl.BinEdges(i+1).*Vc(1)+Lp.*V(1).*1.05],...
            Xmean(2)+[histHdl.BinEdges(i).*Vc(2)+Lp.*V(2).*1.05,...
            histHdl.BinEdges(i).*Vc(2)+Lp.*V(2).*1.05+histHdl.Values(i).*Lp.*V(2).*0.5./maxValue,...
            histHdl.BinEdges(i+1).*Vc(2)+Lp.*V(2).*1.05+histHdl.Values(i).*Lp.*V(2).*0.5./maxValue,...
            histHdl.BinEdges(i+1).*Vc(2)+Lp.*V(2).*1.05],...
            H1.CData,'FaceAlpha',.5);
    
    end
    end
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45

    基本使用

    % 随机生成数据
    X=mvnrnd([0,0],[3,1.5;1.5,2],500);
    
    % 绘图
    [H1,H2,H3,H4]=PCA2Hist(X);
    
    % 创建图例
    lgd=legend([H1,H2,H3,H4(1)],'数据点','主方向','数据范围','统计图');
    lgd.Location='best';
    
    % 坐标区域修饰
    ax=gca;hold on;
    ax.DataAspectRatio=[1,1,1];
    ax.XGrid='on';
    ax.YGrid='on';
    ax.XColor=[.2,.2,.2];
    ax.YColor=[.2,.2,.2];
    ax.GridLineStyle='-.';
    ax.GridAlpha=.1;
    ax.LineWidth=1.1;
    ax.FontSize=11;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    多组数据

    % 随机生成数据
    X1=mvnrnd([0,0],[3,1.5;1.5,2],500);
    X2=mvnrnd([0,0],[3,.1;.1,2],500)-[0,5];
    
    % 绘图
    [H1_1,H1_2,H1_3,H1_4]=PCA2Hist(X1);
    [H2_1,H2_2,H2_3,H2_4]=PCA2Hist(X2);
    
    % 创建图例
    lgd=legend([H1_1,H1_2,H1_3,H1_4(1),H2_1,H2_2,H2_3,H2_4(1)],...
        '数据点','主方向','数据范围','统计图','数据点','主方向','数据范围','统计图');
    lgd.Location='best';
    
    % 坐标区域修饰
    ax=gca;hold on;
    ax.DataAspectRatio=[1,1,1];
    ax.XGrid='on';
    ax.YGrid='on';
    ax.XColor=[.2,.2,.2];
    ax.YColor=[.2,.2,.2];
    ax.GridLineStyle='-.';
    ax.GridAlpha=.1;
    ax.LineWidth=1.1;
    ax.FontSize=11;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    修改配色

    设置CData属性即可:

    % 随机生成数据
    X1=mvnrnd([0,0],[3,1.5;1.5,2],500);
    X2=mvnrnd([0,0],[3,.1;.1,2],500)-[0,5];
    
    % 绘图
    [H1_1,H1_2,H1_3,H1_4]=PCA2Hist(X1,'CData',[122,138,114]./255);
    [H2_1,H2_2,H2_3,H2_4]=PCA2Hist(X2,'CData',[137,150,165]./255);
    
    % 创建图例
    lgd=legend([H1_1,H1_2,H1_3,H1_4(1),H2_1,H2_2,H2_3,H2_4(1)],...
        '数据点','主方向','数据范围','统计图','数据点','主方向','数据范围','统计图');
    lgd.Location='best';
    
    % 坐标区域修饰 
    ax=gca;hold on;
    ax.DataAspectRatio=[1,1,1];
    ax.XGrid='on';
    ax.YGrid='on';
    ax.XColor=[.2,.2,.2];
    ax.YColor=[.2,.2,.2];
    ax.GridLineStyle='-.';
    ax.GridAlpha=.1;
    ax.LineWidth=1.1;
    ax.FontSize=11;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    精细修饰

    对返回的四个对象进行属性设置即可,比如把方向线改为红色,将散点改为圆点:

    % 随机生成数据
    X=mvnrnd([0,0],[3,1.5;1.5,2],500);
    
    % 绘图
    [H1,H2,H3,H4]=PCA2Hist(X);
    
    % 图形对象修饰
    H1.Marker='o';
    H1.MarkerFaceColor=H1.CData;
    H1.MarkerEdgeColor=[1,1,1];
    H1.SizeData=80;
    H1.LineWidth=.8;
    
    H2.Color=[.8,0,0];
    
    % 创建图例
    lgd=legend([H1,H2,H3,H4(1)],'数据点','主方向','数据范围','统计图');
    lgd.Location='best';
    
    % 坐标区域修饰
    ax=gca;hold on;
    ax.DataAspectRatio=[1,1,1];
    ax.XGrid='on';
    ax.YGrid='on';
    ax.XColor=[.2,.2,.2];
    ax.YColor=[.2,.2,.2];
    ax.GridLineStyle='-.';
    ax.GridAlpha=.1;
    ax.LineWidth=1.1;
    ax.FontSize=11;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

  • 相关阅读:
    DBMS_RESOURCE_MANAGER
    VMware 桥接模式下本机 PING 不通虚拟机的解决方法
    16:00面试,16:06就出来了,问的问题有点变态。。。
    OpenCV开发笔记(七十六):相机标定(一):识别棋盘并绘制角点
    FPGA project : IIC_wr_eeprom
    Salesforce震撼发布Einstein 1:下一代人工智能平台和智能对话助手!
    【C++】类和对象——构造函数和析构函数
    Linux概述
    熹微~~~基于Vue开发的昏暗风格的响应式网页!
    使用numpy计算相关系数矩阵:np.corrcoef()
  • 原文地址:https://blog.csdn.net/slandarer/article/details/126816074