|

点击上方蓝字和“好玩的MATLAB”一起快乐玩耍吧!
& }# v( u$ s8 T% e, M* i: D
cdctzxy5nao6405184701.jpg
* z3 x5 k) c7 d" [. S$ [- H. U( A
好玩的matlab
& V$ {- J: j0 R2 m7 d带你解锁不一样的matlab新玩法
& }( ?4 r4 F' L- W; o- `. M# [/ [; l+ h# G8 `3 Y
前面几篇推文详细的介绍了散点图和边际图的画法【MATLAB|回归曲线|置信区间|边际图|核密度填充图、MATLAB|聚类散点图|边际图|核密度填充图】,今天特意添加边际直方图的画法,喜欢此推文的小伙伴们记得点赞+关注+分享!【尊重作者劳动成果,转载请注明推文链接和公众号名】
8 V! e1 H. ]- [2 S# N( B效果效果图图
6 _6 T) R5 ?" a3 t+ I边际直方图效果图4 l% z4 @" \. Q' B% x
g50kqtmifpt6405184801.png
( \. k6 _# S2 S8 D0 b
7 f: J9 X% ^) m5 Y9 m& P$ Y
ktj5wyhl5qd6405184902.gif
$ l0 w. h% @& U5 ^6 a3 C
/ g6 E; J# ? J7 i绘图工具函数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;
+ i! F( `3 C6 a# D 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 属性
8 h2 j7 A5 M: x) N/ ~+ w! Y % 检查 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'; end2 Y$ q4 z5 w4 D, d* ^. R3 B$ P
% 这里绘制到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类,用于创建一个带有附加边际分布信息的直方图图形。以下是对该函数的分析和介绍:类属性:. \" y# O! c8 Q/ `5 J* J* @1 C5 g- l
XData:存储主图中的X轴数据。
/ s, q# P. d5 A5 r. v! kYData:存储主图中的Y轴数据。
# l3 `6 i7 ? K9 b$ IFillColor:存储直方图的填充颜色。
: a6 c+ {+ k2 E4 x9 o3 XFaceAlpha:存储填充区域的透明度。, G( J" ^# r4 H4 ?
HFig:存储图形句柄。
, Z* V8 b6 p* ` P3 N$ E5 n5 ~
. s. O H# a+ D9 K, J. O0 p
ysfeurr15u16405185002.png
' [3 q1 i5 K& F% t根据句柄的形式调用。
; m: _9 |4 C( s& n+ c# Y构造函数 PlotDensHist(sHdl):5 M" J% k! R' A2 @ y/ [) p0 e* I
该构造函数接受一个图形句柄 sHdl 作为输入参数,并从该图形句柄中提取相关属性值,以初始化对象的属性。这些属性包括X轴数据、Y轴数据、填充颜色、线条颜色等。! \2 O/ i8 J& g, R% I7 A- M
构造函数将这些属性存储在对象的属性中,并设置默认的绘图参数。
1 |2 L) y6 z7 Z) o9 LplotDensHist 方法:6 ]; I$ P* R# h( @4 _+ b1 p
plotDensHist 方法用于在MATLAB图形中创建直方图,并添加附加的边际分布信息。4 _) ~" |& ]$ }! A2 M
该方法首先获取当前图形的句柄 hFig,然后创建主图、顶部区域和右侧区域的坐标轴位置。
/ f' q! M0 R# ]' q0 u主图的数据来自对象的属性 XData 和 YData,并根据对象的其他属性(如填充颜色、线条颜色等)来绘制直方图。$ D3 z" Z6 M$ ^+ G) y& }
顶部和右侧区域分别用于绘制边际分布的直方图,使用的数据分别是 XData 和 YData。
1 a4 K7 l' j+ J' W. H) R7 T方法还设置了坐标轴的各种属性,如刻度线样式、字体大小等。
2 `! p ~) _# A- `7 U7 n f- `1 h最后,通过 linkaxes 方法将主图和边际分布区域的坐标轴连接在一起,以确保它们在缩放时保持一致。
0 ^2 v, J6 p" n- w+ R4 N+ N[/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];
$ u# P( V; [! s5 V) q% 使用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');1 ?# e7 i% Z; N% v
% 画出凸包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='';
5 Z. P% P# T" `& K ]# dax.GridLineStyle = '-.'; % 设置网格线样式为虚线ax.GridColor = 'k'; % 设置网格线颜色为红色ax.XGrid = 'off'; % 关闭X网格线ax.YGrid = 'off'; % 打开Y网格线6 y e5 K- `" A' x- d
ax.LineWidth = 1; % 设置坐标线宽ax.XMinorTick = 'on'; % 打开x次要刻度线ax.YMinorTick = 'on'; % 打开y次要刻度线ax.TickDir = 'out'; % 设置刻度线方向向外ax.FontSize = 14; % 设置坐标字体大小
# M, o% l @3 C U+ C8 }8 ZPhdl1=PlotDensHist(sh1);Phdl1.plotDensHist();Phdl2=PlotDensHist(sh2);Phdl2.plotDensHist();Phdl3=PlotDensHist(sh3);Phdl3.plotDensHist(); Y$ N9 }! s, }1 G# D$ ]6 [
j2k5xwlpelx6405185102.png
/ N( _# h7 w0 X3 ?' s2 x- -THE END- - E/ J; \5 d+ h! m0 v' f* G
源码下载:gitee下载:https://gitee.com/iDMatlab/cool-scatter-chart
2 v% V& i6 {% `5 E/ S" I
4ldxmk3h1mn6405185202.png
: b. r p: C9 P0 i' m2 r参考资料:
* `2 p2 `( }! l2 E( k【1】MATLAB|炫酷的聚类散点图【2】MATLAB|聚类散点图|边际图|核密度填充图【3】MATLAB|回归曲线|置信区间|边际图|核密度填充图
6 }! D8 e" R$ C8 b$ d0 K
4shrpvesgrw6405185302.gif
- R) B: o$ I* G- x
tryldu3ewze6405185402.png
+ L. @8 |3 d( G6 {9 r/ S( G3 Z; N3 T送书活动4 ]! c3 C5 I' Q) n; F2 l
npnahmquos56405185502.png
! \( z6 r9 P0 ?, q* Q- D
uv2sxad0mqs6405185602.gif
2 [! O% }$ q7 s6 ]2 F9 R; K
. W" H2 L+ w5 M) B- b包邮赠送 「北京大学出版社」赞助《MATLAB科学计算从入门到精通》$ l6 \, K* a( ~
本书从 MATLAB 基础语法讲起,介绍了基于 MATLAB 函数的科学计算问题求解方法,实现了大量科学计算算法。' k6 p# Q% D# q l1 R( e6 B' ^/ }
本书分为三大部分。第 1 章和第 2 章为 MATLAB 的基础知识,对全书用到的 MATLAB 基础进行了简单介绍。第 3 ~ 12 章为本书的核心部分,包括线性方程组求解、非线性方程求解、数值优化、数据插值、数据拟合与回归分析、数值积分、常微分方程求解、偏微分方程求解、概率统计计算及图像处理与信号处理等内容。第 13 ~ 15 章为实战部分,以实际生活中的数学问题为例,将前文介绍的各类科学计算算法应用其中。本书内容全面、通俗易懂,适合有一定 MATLAB 基础、想要进行进阶学习的读者。! S3 x. h6 e0 Q) d" m8 p7 R
了解更多( t, e5 b' g8 l/ r7 m. U, L
▼▼▼7 Z0 t- I( Q; W, g$ b8 o/ y
0yxkxl4kllh6405185703.jpg
& x6 k d, ^: F& r
. ]% \/ Q7 A) `) T& p, X& T l! u【抽奖方式及满足条件】:1 z; X/ Z9 Q7 V8 P9 r
1.关注「好玩的MATLAB 」公众号和视频号5 e3 Z" @( g/ L! P4 b; G
v1q1tzd2bas6405185803.jpg
1 R! S: p7 \1 |* R* a. u+ \# W2.给本文点【赞】+【在看】;0 h9 h1 ?, |) [* \+ ?( z
3.留言区评论点赞最多的前3名。
* X' {* {: s# t$ h/ G F. R) I( Q4.本活动只针对从未获过奖的同学,之前获过奖的小伙伴,不用参加。
0 d. N- n9 f: [5 r5 L同时满足上述4个条件的读者朋友,包邮赠送一本
2 |/ r* ?; x$ z# q1 f【开奖时间】:2023年10月10日夜晚8点$ z/ h. g. F; {2 E) G
【领奖方式】:在开奖时加小编私人微信:idmatlab
( ?. I# }6 P) L# N+ `扫一扫加管理员微信6 f# Y, {3 d' S
0mjf2p0zdta6405185903.png
3 J8 v8 X0 A8 i$ x
2lkj53rs1xz6405186003.jpg
|
|