电子产业一站式赋能平台

PCB联盟网

搜索
查看: 193|回复: 0
收起左侧

MATLAB|散点图|边际直方图

[复制链接]

260

主题

260

帖子

1831

积分

三级会员

Rank: 3Rank: 3

积分
1831
发表于 2023-10-9 21:26:00 | 显示全部楼层 |阅读模式
点击上方蓝字和“好玩的MATLAB”一起快乐玩耍吧!
1 f: A; k2 E: {/ W9 M

xomcy0sbmwz64017654904.jpg

xomcy0sbmwz64017654904.jpg
+ C* \2 C9 B/ j3 _# L- F1 ^
好玩的matlab+ b; ~' h% N; a( R2 ~, W8 r. X
带你解锁不一样的matlab新玩法
" w9 M" u# A* _7 V# g& ~1 h8 W" _1 x2 y
前面几篇推文详细的介绍了散点图和边际图的画法【MATLAB|回归曲线|置信区间|边际图|核密度填充图、MATLAB|聚类散点图|边际图|核密度填充图】,今天特意添加边际直方图的画法,喜欢此推文的小伙伴们记得点赞+关注+分享!【尊重作者劳动成果,转载请注明推文链接和公众号名】
* P) v2 Z+ y7 e- Z2 r) T& u效果效果图图
! O* G3 g% }2 w: ^" U边际直方图效果图4 C2 F7 V4 w2 y! c( g! ]

prbwcnz0duo64017655004.png

prbwcnz0duo64017655004.png

) h( O, r4 J! f1 ^) _! c) l, x, J  R$ e$ t6 [& u+ o( w

cdzhruvtqrc64017655104.gif

cdzhruvtqrc64017655104.gif

- u, {5 [& z" P1 h* F/ E
7 r- I" N6 l4 a' U: `0 [绘图工具函数
  • classdef PlotDensHist    %--------------------------------------------------------------------------    % @Author: 好玩的Matlab    % @公众号:好玩的Matlab    % @Created: 09,06,2023    % @Email:2377389590@qq.com    % 尊重劳动成果,转载请备注推文链接和公众号名。    % @Disclaimer: This code is provided as-is without any warranty.    %--------------------------------------------------------------------------    properties        XData;       % x数据        YData;       % y数据        FillColor;   % 填充颜色        FaceAlpha;   % 透明度数        HFig;        % 图形句柄    end    methods        function obj  = PlotDensHist(sHdl)            % 设置默认参数            obj.XData = get(sHdl, 'XData');            obj.YData = get(sHdl, 'YData');            obj.FillColor = get(sHdl, 'CData');            obj.FaceAlpha = get(sHdl, 'MarkerFaceAlpha') * 0.4;
    2 F1 k& s* A5 Q0 j& h9 k: F+ v            obj.HFig = gcf;        end        function plotDensHist(obj)            hFig = obj.HFig;  % 获取当前figure的句柄            axesPositions = {[0.07, 0.07, 0.65, 0.65],...   % 主图                [0.07, 0.07, 0.65, 0.65],...               % 与主图重合                [0.07, 0.74, 0.65, 0.2],...                % 顶部区域                [0.74, 0.07, 0.2, 0.65]};                 % 右侧区域            axObj = findall(hFig, 'Type', 'axes');            hFig.Position = [439 76 891 790];            axesCount = length(axObj);            if axesCount == 1                ax = gca;                ax.Box = 'on';                ax.Position = axesPositions{1};                topAxes = axes('position', axesPositions{3});                rightAxes = axes('position', axesPositions{4});            end            % 遍历所有 Axes 对象            for i = 1:length(axObj)                ax = axObj(i);  % 获取当前 Axes 对象                pos = get(ax, 'Position');  % 获取当前 Axes 对象的 Position 属性5 O+ l2 u  V0 Q* K9 {, e4 r1 F. w6 d
                    % 检查 Position 是否匹配                if sum(abs(pos - axesPositions{1})) 1e-6                    mainAxes = ax;                elseif  sum(abs(pos - axesPositions{3})) 1e-6                    topAxes = ax;                elseif sum(abs(pos - axesPositions{4})) 1e-6                    rightAxes = ax;                end            end            xi = obj.XData;            yi = obj.YData;            nbins = round(length(xi) / 4);            % 这里绘制到topAxes            if ~isempty(topAxes)                axes(topAxes);                hold on;                histogram(topAxes, xi, nbins, 'FaceColor', obj.FillColor, ...                    'EdgeColor', obj.FillColor, 'FaceAlpha', obj.FaceAlpha, 'LineWidth', 0.5)                topAxes.YDir = 'normal';                topAxes.XMinorTick = 'on';                topAxes.YMinorTick = 'on';                topAxes.TickDir = 'out';                topAxes.TickLength = [.011 .01];                topAxes.XTickLabel = {};                topAxes.Visible = 'on';                topAxes.Box = 'off';                topAxes.LineWidth = 1.2;                topAxes.FontSize = 18;                topAxes.FontName = 'Times New Roman';                topAxes.XLim = ax.XLim;                topAxes.Box = 'off';            end
    " G8 c8 d% S6 y( J" A. w) r! N            % 这里绘制到rightAxes            if ~isempty(rightAxes)                axes(rightAxes);                hold on;                histogram(rightAxes, yi, nbins, 'FaceColor', obj.FillColor, 'Orientation', 'horizontal', ...                    'EdgeColor', obj.FillColor, 'FaceAlpha', obj.FaceAlpha, 'LineWidth', 0.5)                rightAxes.YDir = 'normal';                rightAxes.XMinorTick = 'on';                rightAxes.YMinorTick = 'on';                rightAxes.TickDir = 'out';                rightAxes.TickLength = [.011 .01];                rightAxes.YTickLabel = {};                rightAxes.Visible = 'on';                rightAxes.Box = 'off';                rightAxes.LineWidth = 1.2;                rightAxes.FontSize = 18;                rightAxes.FontName = 'Times New Roman';                rightAxes.XLim = topAxes.YLim;                rightAxes.YLim = ax.YLim;                rightAxes.Box = 'off';            end            % 绑定X Y            linkaxes([mainAxes, rightAxes], 'y')            linkaxes([mainAxes, topAxes], 'x')        end    endend这个函数定义了PlotDensHist的MATLAB类,用于创建一个带有附加边际分布信息的直方图图形。以下是对该函数的分析和介绍:类属性:
    - s) D/ B0 J% s+ mXData:存储主图中的X轴数据。
      [- @$ \# Z& E  o4 J$ Y- J0 E9 {YData:存储主图中的Y轴数据。  q" h2 h0 t: z3 k7 n; z
    FillColor:存储直方图的填充颜色。
    / m4 W1 n* z1 Y$ |0 F" P2 v' X
    FaceAlpha:存储填充区域的透明度。- [8 b' S) o' c! ?4 Z5 q4 b8 p1 U* `
    HFig:存储图形句柄。9 C8 [% P" {  A  f* {( h9 ?( x' s

    # |7 ?5 Y% d1 z- J1 @

    orqcsmntx0z64017655205.png

    orqcsmntx0z64017655205.png
    # |+ [: t  c/ ^* Z( T" E, i
    根据句柄的形式调用。
    / M1 @: P- d' H构造函数 PlotDensHist(sHdl):
    * K2 |- k3 B: {  ~$ n+ W) _, F该构造函数接受一个图形句柄 sHdl 作为输入参数,并从该图形句柄中提取相关属性值,以初始化对象的属性。这些属性包括X轴数据、Y轴数据、填充颜色、线条颜色等。
    ; P; l7 R0 |1 g2 }( w1 B2 b: ]构造函数将这些属性存储在对象的属性中,并设置默认的绘图参数。
    7 K' |0 X3 ^0 q& C5 n, N5 S4 h2 G
    plotDensHist 方法:
    + H/ w1 }' R# l- p+ Q+ w0 w7 ~plotDensHist 方法用于在MATLAB图形中创建直方图,并添加附加的边际分布信息。% X+ O) w! N0 f0 d0 q0 l9 }& w
    该方法首先获取当前图形的句柄 hFig,然后创建主图、顶部区域和右侧区域的坐标轴位置。
    % Z9 {3 F+ j6 m; m% Q3 S6 o主图的数据来自对象的属性 XData 和 YData,并根据对象的其他属性(如填充颜色、线条颜色等)来绘制直方图。7 ]# Q3 p3 \: U+ c! U4 r5 g+ x4 R2 k
    顶部和右侧区域分别用于绘制边际分布的直方图,使用的数据分别是 XData 和 YData。4 m0 ]( t+ d! l/ }3 x- F
    方法还设置了坐标轴的各种属性,如刻度线样式、字体大小等。, ~$ `  I- y! ~/ ]; T
    最后,通过 linkaxes 方法将主图和边际分布区域的坐标轴连接在一起,以确保它们在缩放时保持一致。7 w2 y! c* [/ d" ~. c
    [/ol]案例
  • clc;clear;close all;d1=repmat([2 2],100,1) + randn(100,2)*[1 .5; 0 1.32];d2=repmat([9 1],100,1) + randn(100,2)*[1.4 0.2; 0 0.98];d3=repmat([6 8],100,1) + randn(100,2)*[1 0.5; 0 1];: p: R3 J, [4 g* c- h
    % 使用scatter函数绘制散点图hold onsh1=scatter(d1(:,1), d1(:,2),'filled','CData',[0,0,1],'MarkerFaceAlpha',0.5,'MarkerEdgeColor','none','Marker','o');sh2=scatter(d2(:,1), d2(:,2),'filled','CData',[0,1,0],'MarkerFaceAlpha',0.5,'MarkerEdgeColor','none','Marker','^');sh3=scatter(d3(:,1), d3(:,2),'filled','CData',[1,0.6471,0],'MarkerFaceAlpha',0.5,'MarkerEdgeColor','none','Marker','s');
    # p: G' ]$ f1 U2 B( v( `  G! G% 画出凸包k1 = convhull(d1(:,1), d1(:,2));k2 = convhull(d2(:,1), d2(:,2));k3 = convhull(d3(:,1), d3(:,2));line(d1(k1,1), d1(k1,2), 'Color', [0 0 1],'LineWidth',1.2)line(d2(k2,1), d2(k2,2), 'Color', [0,1,0],'LineWidth',1.2)line(d3(k3,1), d3(k3,2), 'Color', [1,0.6471,0],'LineWidth',1.2)legend('demo1','demo2','demo3','box','off','Location','best')% 设置标签和标题ax=gca;box onax.XLim=[-2,15];ax.YLim=[-4,13];ax.XLabel.String='X';ax.YLabel.String='Y';ax.Title.String='';: ]' r2 a, R- h8 f' W
    ax.GridLineStyle = '-.'; % 设置网格线样式为虚线ax.GridColor = 'k'; % 设置网格线颜色为红色ax.XGrid = 'off'; % 关闭X网格线ax.YGrid = 'off';  % 打开Y网格线, j: f; Y+ W6 z1 r* g& c
    ax.LineWidth = 1;            % 设置坐标线宽ax.XMinorTick = 'on';        % 打开x次要刻度线ax.YMinorTick = 'on';        % 打开y次要刻度线ax.TickDir = 'out';           % 设置刻度线方向向外ax.FontSize = 14;            % 设置坐标字体大小0 r0 R+ T7 }' k3 I. _
    Phdl1=PlotDensHist(sh1);Phdl1.plotDensHist();Phdl2=PlotDensHist(sh2);Phdl2.plotDensHist();Phdl3=PlotDensHist(sh3);Phdl3.plotDensHist();
    " U! e4 i" N5 p+ c- O, k  C

    p4yxmtzg2vi64017655305.png

    p4yxmtzg2vi64017655305.png

    6 M. T0 u9 T+ m+ I- -THE END- -7 Q- H  _# Q7 a+ r* o  `
    源码下载:gitee下载:https://gitee.com/iDMatlab/cool-scatter-chart
    - N1 S6 D5 O' T, i  q3 L

    p0x1jgej2ib64017655405.png

    p0x1jgej2ib64017655405.png
    9 R  f. c( w! l/ T9 n" l% u
    参考资料:
    ( A7 ~: T  w8 b' H【1】MATLAB|炫酷的聚类散点图【2】MATLAB|聚类散点图|边际图|核密度填充图【3】MATLAB|回归曲线|置信区间|边际图|核密度填充图
    0 o5 f  h4 |* O8 I+ X3 B

    fgc5hpp1a0g64017655505.gif

    fgc5hpp1a0g64017655505.gif
    - Q9 O- U- g$ B* P. `' [

    nq0iipvpeeo64017655605.png

    nq0iipvpeeo64017655605.png

    8 A( B5 b1 ^0 K5 r, {, U! }送书活动, Y) O, P9 Z9 Y4 z+ g8 L. K' g

    cnpelutgnqx64017655705.png

    cnpelutgnqx64017655705.png
    1 ]6 V( _& {1 x8 d1 o4 d

    4wmhpghf5ce64017655805.gif

    4wmhpghf5ce64017655805.gif

    $ u" k0 c! Q% \0 S7 Y/ W0 h% r$ E
    9 p' p/ Z' Z2 Q! y5 W& N/ Q" s! n+ `* y包邮赠送 「北京大学出版社赞助《MATLAB科学计算从入门到精通》
    8 u4 G8 J9 D( S/ G$ n# n本书从 MATLAB 基础语法讲起,介绍了基于 MATLAB 函数的科学计算问题求解方法,实现了大量科学计算算法。5 |6 i2 i/ X# e4 ]2 V+ _
    本书分为三大部分。第 1 章和第 2 章为 MATLAB 的基础知识,对全书用到的 MATLAB 基础进行了简单介绍。第 3 ~ 12 章为本书的核心部分,包括线性方程组求解、非线性方程求解、数值优化、数据插值、数据拟合与回归分析、数值积分、常微分方程求解、偏微分方程求解、概率统计计算及图像处理与信号处理等内容。第 13 ~ 15 章为实战部分,以实际生活中的数学问题为例,将前文介绍的各类科学计算算法应用其中。本书内容全面、通俗易懂,适合有一定 MATLAB 基础、想要进行进阶学习的读者。
    0 c# _. l4 _& e6 m了解更多
    6 l; W2 E$ K+ U& [0 g9 n( H/ Y▼▼▼
    ) {# x; T, y/ X( |

    nfn5hpiquaa64017655905.jpg

    nfn5hpiquaa64017655905.jpg
    0 j& ]0 \. V1 p8 I% Q- U. K

    1 m$ K# b6 h" B+ A" `4 A6 ]; }
    【抽奖方式及满足条件】:
    8 x" t0 Y, Q0 |/ H$ p- B1.关注「好玩的MATLAB 」公众号和视频号
    ( _& w0 G5 d+ z0 b8 N% V6 Q

    hmqqnfw0ufa64017656005.jpg

    hmqqnfw0ufa64017656005.jpg
    : c9 {$ ]' D6 g/ A; A+ w
    2.给本文点【】+【在看】;/ H- r( o! c5 D
    3.留言区评论点赞最多的前3名。- c( T: H3 N4 s. r. p" e
    4.本活动只针对从未获过奖的同学,之前获过奖的小伙伴,不用参加。
    ! \: V6 m2 q8 R3 c( ~5 `同时满足上述4个条件的读者朋友,包邮赠送一本
    3 \: F8 ~2 Z" a【开奖时间】:2023年10月10日夜晚8点; {6 |* {1 y2 n5 S, N
    【领奖方式】:在开奖时加小编私人微信:idmatlab
    6 P7 C8 R6 B1 ]; y7 `扫一扫加管理员微信
    " X, u& }; i" E& n

    x1yzpr54cci64017656105.png

    x1yzpr54cci64017656105.png
    6 s" {: [; h+ o+ ?$ q9 L

    l0lsazkn5xv64017656205.jpg

    l0lsazkn5xv64017656205.jpg
  • 回复

    使用道具 举报

    发表回复

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则


    联系客服 关注微信 下载APP 返回顶部 返回列表