Matlab实现二维散点主方向直方图的绘制详解

 更新时间:2022年09月13日 10:36:41   作者:slandarer  
这篇文章主要为大家详细介绍了如何利用Matlab实现二维散点主方向直方图的绘制,文中的示例代码讲解详细,对我们学习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);
[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

基本使用

% 随机生成数据
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;

多组数据

% 随机生成数据
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;

修改配色

设置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;

精细修饰

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

% 随机生成数据
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;

到此这篇关于Matlab实现二维散点主方向直方图的绘制详解的文章就介绍到这了,更多相关Matlab直方图内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • c/c++单例模式类的混合编译案例详解

    c/c++单例模式类的混合编译案例详解

    ​ 由于c语言中没有类的概念,因此对于有类的cpp文件与c文件混合编译时,提供一个中间层提供类的操作接口,在c文件中调用接口实现间接操作类对象,这篇文章主要介绍了c/c++单例模式类的混合编译的相关资料
    2022-10-10
  • Qt编写地图实现海量点位标注

    Qt编写地图实现海量点位标注

    海量点位标注的出现,是为了解决普通设备点超过几百个性能极速降低的问题。本文将介绍如何通过Qt实现海量点位标注功能,感兴趣的可以了解一下
    2022-01-01
  • C++中引用传递与指针传递的区别(面试常见)

    C++中引用传递与指针传递的区别(面试常见)

    这篇文章主要介绍了C++中引用传递与指针传递的区别(面试常见),需要的朋友可以参考下
    2018-03-03
  • OpenCV实现直线检测并消除

    OpenCV实现直线检测并消除

    这篇文章主要为大家详细介绍了OpenCV实现直线检测并消除,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-06-06
  • C++实现将数组中的值反转

    C++实现将数组中的值反转

    这里给大家分享的事一则C++实现将数组中的值反转的代码,取材自《C++程序设计》(梁勇著第三版367页),有需要的小伙伴可以参考下
    2016-05-05
  • C语言中continue的用法详解

    C语言中continue的用法详解

    在C语言当中的continue和break语句是有一些类似的,但是它并不是强制进行终止的,下面这篇文章主要给大家介绍了关于C语言中continue用法的相关资料,需要的朋友可以参考下
    2022-11-11
  • C/C++中I/O进阶详解及其作用介绍

    C/C++中I/O进阶详解及其作用介绍

    这篇文章主要介绍了C/C++中I/O进阶详解及其作用,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • c++ 对象分配在栈上还是在堆上问题分析

    c++ 对象分配在栈上还是在堆上问题分析

    这篇文章主要为大家介绍了c++ 对象在栈上还是在堆上问题分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11
  • C语言嵌入informix基础入门示例讲解

    C语言嵌入informix基础入门示例讲解

    这篇文章主要介绍了C语言嵌入informix基础方法,大家参考使用
    2013-11-11
  • C语言经典例程100例(经典c程序100例)

    C语言经典例程100例(经典c程序100例)

    这篇文章主要介绍了C语言经典例程100例,经典c程序100例,学习c语言的朋友可以参考一下
    2018-03-03

最新评论