電子產(chǎn)業(yè)一站式賦能平臺

PCB聯(lián)盟網(wǎng)

搜索
查看: 102|回復(fù): 0
收起左側(cè)

MATLAB|散點(diǎn)圖|邊際直方圖

[復(fù)制鏈接]

193

主題

193

帖子

1532

積分

三級會員

Rank: 3Rank: 3

積分
1532
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2023-10-9 21:26:00 | 只看該作者 |只看大圖 回帖獎勵 |倒序?yàn)g覽 |閱讀模式
點(diǎn)擊上方藍(lán)字和“好玩的MATLAB”一起快樂玩耍吧!

好玩的matlab
帶你解鎖不一樣的matlab新玩法

前面幾篇推文詳細(xì)的介紹了散點(diǎn)圖和邊際圖的畫法【MATLAB|回歸曲線|置信區(qū)間|邊際圖|核密度填充圖、MATLAB|聚類散點(diǎn)圖|邊際圖|核密度填充圖】,今天特意添加邊際直方圖的畫法,喜歡此推文的小伙伴們記得點(diǎn)贊+關(guān)注+分享!【尊重作者勞動成果,轉(zhuǎn)載請注明推文鏈接和公眾號名】
效果效果圖圖
邊際直方圖效果圖




繪圖工具函數(shù)
  • classdef PlotDensHist    %--------------------------------------------------------------------------    % @Author: 好玩的Matlab    % @公眾號:好玩的Matlab    % @Created: 09,06,2023    % @Email:2377389590@qq.com    % 尊重勞動成果,轉(zhuǎn)載請備注推文鏈接和公眾號名。    % @Disclaimer: This code is provided as-is without any warranty.    %--------------------------------------------------------------------------    properties        XData;       % x數(shù)據(jù)        YData;       % y數(shù)據(jù)        FillColor;   % 填充顏色        FaceAlpha;   % 透明度數(shù)        HFig;        % 圖形句柄    end    methods        function obj  = PlotDensHist(sHdl)            % 設(shè)置默認(rèn)參數(shù)            obj.XData = get(sHdl, 'XData');            obj.YData = get(sHdl, 'YData');            obj.FillColor = get(sHdl, 'CData');            obj.FaceAlpha = get(sHdl, 'MarkerFaceAlpha') * 0.4;
                obj.HFig = gcf;        end        function plotDensHist(obj)            hFig = obj.HFig;  % 獲取當(dāng)前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],...                % 頂部區(qū)域                [0.74, 0.07, 0.2, 0.65]};                 % 右側(cè)區(qū)域            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);  % 獲取當(dāng)前 Axes 對象                pos = get(ax, 'Position');  % 獲取當(dāng)前 Axes 對象的 Position 屬性
                    % 檢查 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
                % 這里繪制到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這個(gè)函數(shù)定義了PlotDensHist的MATLAB類,用于創(chuàng)建一個(gè)帶有附加邊際分布信息的直方圖圖形。以下是對該函數(shù)的分析和介紹:類屬性:
    XData:存儲主圖中的X軸數(shù)據(jù)。
    YData:存儲主圖中的Y軸數(shù)據(jù)。
    FillColor:存儲直方圖的填充顏色。
    FaceAlpha:存儲填充區(qū)域的透明度。
    HFig:存儲圖形句柄。


    根據(jù)句柄的形式調(diào)用。
    構(gòu)造函數(shù) PlotDensHist(sHdl):
    該構(gòu)造函數(shù)接受一個(gè)圖形句柄 sHdl 作為輸入?yún)?shù),并從該圖形句柄中提取相關(guān)屬性值,以初始化對象的屬性。這些屬性包括X軸數(shù)據(jù)、Y軸數(shù)據(jù)、填充顏色、線條顏色等。
    構(gòu)造函數(shù)將這些屬性存儲在對象的屬性中,并設(shè)置默認(rèn)的繪圖參數(shù)。
    plotDensHist 方法:
    plotDensHist 方法用于在MATLAB圖形中創(chuàng)建直方圖,并添加附加的邊際分布信息。
    該方法首先獲取當(dāng)前圖形的句柄 hFig,然后創(chuàng)建主圖、頂部區(qū)域和右側(cè)區(qū)域的坐標(biāo)軸位置。
    主圖的數(shù)據(jù)來自對象的屬性 XData 和 YData,并根據(jù)對象的其他屬性(如填充顏色、線條顏色等)來繪制直方圖。
    頂部和右側(cè)區(qū)域分別用于繪制邊際分布的直方圖,使用的數(shù)據(jù)分別是 XData 和 YData。
    方法還設(shè)置了坐標(biāo)軸的各種屬性,如刻度線樣式、字體大小等。
    最后,通過 linkaxes 方法將主圖和邊際分布區(qū)域的坐標(biāo)軸連接在一起,以確保它們在縮放時(shí)保持一致。
    [/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];
    % 使用scatter函數(shù)繪制散點(diǎn)圖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');
    % 畫出凸包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')% 設(shè)置標(biāo)簽和標(biāo)題ax=gca;box onax.XLim=[-2,15];ax.YLim=[-4,13];ax.XLabel.String='X';ax.YLabel.String='Y';ax.Title.String='';
    ax.GridLineStyle = '-.'; % 設(shè)置網(wǎng)格線樣式為虛線ax.GridColor = 'k'; % 設(shè)置網(wǎng)格線顏色為紅色ax.XGrid = 'off'; % 關(guān)閉X網(wǎng)格線ax.YGrid = 'off';  % 打開Y網(wǎng)格線
    ax.LineWidth = 1;            % 設(shè)置坐標(biāo)線寬ax.XMinorTick = 'on';        % 打開x次要刻度線ax.YMinorTick = 'on';        % 打開y次要刻度線ax.TickDir = 'out';           % 設(shè)置刻度線方向向外ax.FontSize = 14;            % 設(shè)置坐標(biāo)字體大小
    Phdl1=PlotDensHist(sh1);Phdl1.plotDensHist();Phdl2=PlotDensHist(sh2);Phdl2.plotDensHist();Phdl3=PlotDensHist(sh3);Phdl3.plotDensHist();

    - -THE END- -
    源碼下載:gitee下載:https://gitee.com/iDMatlab/cool-scatter-chart

    參考資料:
    【1】MATLAB|炫酷的聚類散點(diǎn)圖【2】MATLAB|聚類散點(diǎn)圖|邊際圖|核密度填充圖【3】MATLAB|回歸曲線|置信區(qū)間|邊際圖|核密度填充圖


    送書活動



    包郵贈送 「北京大學(xué)出版社贊助《MATLAB科學(xué)計(jì)算從入門到精通》
    本書從 MATLAB 基礎(chǔ)語法講起,介紹了基于 MATLAB 函數(shù)的科學(xué)計(jì)算問題求解方法,實(shí)現(xiàn)了大量科學(xué)計(jì)算算法。
    本書分為三大部分。第 1 章和第 2 章為 MATLAB 的基礎(chǔ)知識,對全書用到的 MATLAB 基礎(chǔ)進(jìn)行了簡單介紹。第 3 ~ 12 章為本書的核心部分,包括線性方程組求解、非線性方程求解、數(shù)值優(yōu)化、數(shù)據(jù)插值、數(shù)據(jù)擬合與回歸分析、數(shù)值積分、常微分方程求解、偏微分方程求解、概率統(tǒng)計(jì)計(jì)算及圖像處理與信號處理等內(nèi)容。第 13 ~ 15 章為實(shí)戰(zhàn)部分,以實(shí)際生活中的數(shù)學(xué)問題為例,將前文介紹的各類科學(xué)計(jì)算算法應(yīng)用其中。本書內(nèi)容全面、通俗易懂,適合有一定 MATLAB 基礎(chǔ)、想要進(jìn)行進(jìn)階學(xué)習(xí)的讀者。
    了解更多
    ▼▼▼


    【抽獎方式及滿足條件】:
    1.關(guān)注「好玩的MATLAB 」公眾號和視頻號

    2.給本文點(diǎn)【】+【在看】;
    3.留言區(qū)評論點(diǎn)贊最多的前3名。
    4.本活動只針對從未獲過獎的同學(xué),之前獲過獎的小伙伴,不用參加。
    同時(shí)滿足上述4個(gè)條件的讀者朋友,包郵贈送一本
    【開獎時(shí)間】:2023年10月10日夜晚8點(diǎn)
    【領(lǐng)獎方式】:在開獎時(shí)加小編私人微信:idmatlab
    掃一掃加管理員微信

  • 發(fā)表回復(fù)

    您需要登錄后才可以回帖 登錄 | 立即注冊

    本版積分規(guī)則


    聯(lián)系客服 關(guān)注微信 下載APP 返回頂部 返回列表