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

PCB聯盟網

搜索
查看: 177|回復: 0
收起左側

MATLAB|散點圖|邊際直方圖

[復制鏈接]

193

主題

193

帖子

1532

積分

三級會員

Rank: 3Rank: 3

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

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

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




繪圖工具函數
  • 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;
                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],...                % 頂部區(qū)域                [0.74, 0.07, 0.2, 0.65]};                 % 右側區(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);  % 獲取當前 Axes 對象                pos = get(ax, 'Position');  % 獲取當前 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這個函數定義了PlotDensHist的MATLAB類,用于創(chuàng)建一個帶有附加邊際分布信息的直方圖圖形。以下是對該函數的分析和介紹:類屬性:
    XData:存儲主圖中的X軸數據。
    YData:存儲主圖中的Y軸數據。
    FillColor:存儲直方圖的填充顏色。
    FaceAlpha:存儲填充區(qū)域的透明度。
    HFig:存儲圖形句柄。


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


    送書活動



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


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

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

  • 回復

    使用道具 舉報

    發(fā)表回復

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

    本版積分規(guī)則


    聯系客服 關注微信 下載APP 返回頂部 返回列表