|

点击上方蓝字和“好玩的MATLAB”一起快乐玩耍吧!
9 W3 R# J* o* V2 A, K
8 ]' y- [+ r5 N3 I) i
rqjbvyrhpeu64018950556.jpg
& L2 ]6 H! B/ j8 N
好玩的matlab' {" d$ Q# A3 v4 N/ s- s
带你解锁不一样的matlab新玩法
5 S' |3 x9 ~6 `. M! z: \$ p5 @0 b: z0 l. _; |( b' q9 ^
今天教大家怎么绘制热力直方图,喜欢此推文的小伙伴们记得点赞+关注+分享!
: g# @, A1 |8 K, F- S3 {热力直方图是一种结合了热力图和直方图的数据可视化方法,它能够更加全面地展示数据的分布特征和关联性。在某些应用场景中,使用热力直方图优势:直观展示数据密度:热力图部分可以直观地显示数据在二维空间中的分布密度。颜色越暗或越亮表示数据密度越高,这有助于快速识别数据的聚集区域和稀疏区域。揭示变量间关系:热力直方图可以帮助我们观察两个变量之间的关系。通过分析热力图中颜色的分布和变化,我们可以发现两个变量之间的相关性或者潜在的模式。边缘分布信息:直方图部分显示了各个变量的边缘分布,这有助于我们了解单个变量的分布特征,例如数据的中心趋势、离散程度以及潜在的异常值。直观的多维数据展示:热力直方图可以在一个图形中展示多个维度的信息。这使得我们能够更加方便地比较、分析和解释数据。定制性强:热力直方图可以根据需要定制不同的颜色方案、绘制风格和布局。这使得它能够适应各种场景,满足不同的分析需求。[/ol]效果图$ q: h, K9 j" Q, R4 z0 ?
; |: r! { D0 t* `; `
hksskzgb3ix64018950656.png
" o5 L) I1 Z# S% [! M, v- _, f
9 N3 v' C/ w3 q$ H A
zstcdz1svsp64018950756.png
: g# r, D+ u- t' j" V1 v
4 \. X# h; y- }) ]1 E% A: Z: B
详细教程' X, |1 x2 v A: i) }; Q2 }. e
数据设置+ {- E8 H/ \& l. W& C
clc;clear;close all;z = [repmat([2 4],1000,1) + randn(1000,2)*[1 .1; 0 1.32];... repmat([10 1],1000,1) + randn(1000,2)*[1 .5; 0 1.32];... repmat([6 12],1000,1) + randn(1000,2)*[1 .5; 0 1.32];];x=z(:,1);y=z(:,2);1、默认参数绘图; J9 S7 P$ n+ G8 p$ I
figure[mainDataAxes1, xhistAxes1, yhistAxes1] = heatMapHistV(x, y);
; S! U% \, M, j7 `4 d5 S
nmlbhvgo1yo64018950856.png
/ p9 d. C' }" I- b& v) {
2、绘制sct属性的散点图,设置直方图的颜色、位置。
! W7 @$ i% j8 Tfigure% 定义x轴直方图的参数:蓝色填充、黑色边缘、透明度为0.8xBarParams2 = {'facecolor', [0, 0, 1], 'edgecolor', 'black', 'FaceAlpha', 0.8};% 定义y轴直方图的参数:红色填充、黑色边缘、透明度为0.8、右边绘制直方图yBarParams2 = {'facecolor', [0.7, 0.1, 0.1], 'edgecolor', 'black', 'FaceAlpha', 0.8, 'right'};% 定义散点图参数:圆形标记、黑色边缘、绿色填充、大小为80、透明度为1plotParams2 = {'Marker', 'o', 'MarkerEdgeColor', 'k', 'MarkerFaceColor', [0.5, 0.9, 0.5], 'SizeData', 80, 'MarkerFaceAlpha', 1};% 设置主标题mainTitle2 = '散点图&直方图';% 调用heatMapHistV函数创建热图、x轴直方图和y轴直方图[mainDataAxes2, xhistAxes2, yhistAxes2] = heatMapHistV(x, y, 30, 30, 'sct', plotParams2, xBarParams2, yBarParams2, mainTitle2);
& W. m v7 L5 c5 I* n$ n
kmjyveg3bon64018950956.png
$ B. X5 f/ w' P1 ~
3、设置img绘图属性 ,添加标题,设置右侧的颜色条。5 k$ u1 u5 L% u. l3 K# X: W/ K
figure% 定义x轴直方图的参数:绿色填充、黑色边缘、透明度为0.5xBarParams3 = {'facecolor', [0, 1, 0], 'edgecolor', 'black', 'FaceAlpha', 0.5};% 定义y轴直方图的参数:红色填充、黑色边缘、透明度为0.5yBarParams3 = {'facecolor', [0.7, 0.1, 0.1], 'edgecolor', 'black', 'FaceAlpha', 0.5};% 设置主标题mainTitle3 = '热力图&直方图';% 调用heatMapHistV函数创建热图、x轴直方图和y轴直方图[mainDataAxes3, xhistAxes3, yhistAxes3] = heatMapHistV(x, y, 35, 30, 'img', {}, xBarParams3, yBarParams3, mainTitle3);% 定义热图的颜色映射cmap = pink(65);% 为热图应用颜色映射colormap(mainDataAxes3, cmap);% 为热图添加颜色条hcb = colorbar(mainDataAxes3);% 设置颜色条的位置和大小set(hcb, 'Location', 'eastoutside', 'Position', [0.73 0.3 0.02 0.4]); % 右侧" m' ^: i8 c- T' b5 z; D
f3awgyhqfok64018951057.png
7 o3 @# V2 e0 G4、设置srf绘图属性,设置右侧颜色条。* J# c, C. T3 j3 C5 K) O5 b D: S5 P' A
figure% 定义x轴直方图的参数:绿色填充、黑色边缘、透明度为0.5xBarParams4 = {'facecolor', [0, 1, 0], 'edgecolor', 'black', 'FaceAlpha', 0.5};% 定义y轴直方图的参数:橙色填充、黑色边缘、透明度为0.5yBarParams4 = {'facecolor', [0.9, 0.4, 0.1], 'edgecolor', 'black', 'FaceAlpha', 0.5};% 定义绘制热力图的参数:无边缘颜色plotParams4 = {'EdgeColor', 'none'};% 调用heatMapHistV函数创建曲面热图、x轴直方图和y轴直方图[mainDataAxes4, xhistAxes4, yhistAxes4] = heatMapHistV(x, y, 35, 30, 'srf', plotParams4, xBarParams4, yBarParams4);% 定义曲面热图的颜色映射cmap = cool(65);% 为曲面热图应用颜色映射colormap(mainDataAxes4, cmap);% 为曲面热图添加颜色条hcb = colorbar(mainDataAxes4);% 设置颜色条的位置和大小set(hcb, 'Location', 'eastoutside', 'Position', [0.73 0.3 0.02 0.4]);# N! B5 m: f' A! |: P
bkpvyzhtcqx64018951157.png
0 u8 m- k- h" h1 @3 f9 t
5、设置srfN绘图属性,设置上侧颜色条。. `' f. h% o; ]
figure% 定义绘制热力图的参数:无边缘颜色plotParams5 = {'EdgeColor', 'none'};% 设置主标题mainTitle5 = '热力图&直方图';% 调用heatMapHistV函数创建不显示低频值的曲面热图、x轴直方图和y轴直方图[mainDataAxes5, xhistAxes5, yhistAxes5] = heatMapHistV(x, y, 35, 30, 'srfN', plotParams5, xBarParams4, yBarParams4);% 为曲面热图应用颜色映射colormap(mainDataAxes5, cmap);% 为曲面热图添加颜色条hcb = colorbar(mainDataAxes5);% 设置颜色条的位置和大小(上侧)set(hcb, 'Location', 'northoutside', 'Position', [0.30 0.73 0.4 0.04]);, c0 r. E7 ^7 N; J o9 r) B
q1drc2tiisw64018951257.png
. R' k3 X, l: K5 O2 O, z6、设置srfN绘图属性,设置左侧颜色条。+ E9 v( Z; L- x( d# h' I
figure% 定义x轴直方图参数xBarParams6 = {'facecolor', [0,1,0], 'edgecolor', 'black','FaceAlpha',0.5};% 定义y轴直方图参数yBarParams6 = {'facecolor', [0.9,0.4,0.1], 'edgecolor', 'black','FaceAlpha',0.5,'right'};% 定义热力图参数plotParams6 = {'EdgeColor','none'};% 主标题mainTitle6='热力图&直方图';% 使用heatMapHistV函数绘制热力图和直方图[mainDataAxes6, xhistAxes6, yhistAxes6] = heatMapHistV(x, y, 35, 30, 'srfN',plotParams6,xBarParams6 ,yBarParams6 ,mainTitle6);% 设置热力图的颜色映射cmap = jet(65);colormap(mainDataAxes6, cmap);% 添加颜色条hcb =colorbar(mainDataAxes6);% 设置颜色条位置set(hcb, 'Location', 'eastoutside', 'Position', [0.22 0.3 0.02 0.4]); %左侧
% z. O, q; b2 J3 ?* `, @2 |# F
dkgf4krwivg64018951357.png
$ a" ?7 C& i+ K) y6 {0 o7、设置srfNE绘图属性,设置左侧颜色条。
7 s7 L3 h0 o5 L3 [7 W Tfigure% 定义x轴直方图参数xBarParams7 = {'up','facecolor', [0.5,0,0]};% 定义y轴直方图参数yBarParams7 = {'right','facecolor', [0.2,0.5,0.5]};% 定义热力图参数plotParams7 = {'EdgeColor','none'};% 主标题mainTitle7='热力图&直方图';% 使用heatMapHistV函数绘制热力图和直方图[mainDataAxes7, xhistAxes7, yhistAxes7] = heatMapHistV(x, y, 35, 30, 'srfNE',plotParams7,xBarParams7 ,yBarParams7 ,mainTitle7);% 设置热力图的颜色映射cmap = jet(65);colormap(mainDataAxes7, cmap);% 添加颜色条hcb =colorbar(mainDataAxes7);% 设置颜色条位置set(hcb, 'Location', 'eastoutside', 'Position', [0.22 0.3 0.02 0.4]); %右侧% F+ W# p' Q$ \- @
u4vtgvac5l364018951457.png
0 |3 O) K1 g+ l8、设置sctC绘图属性的散点热力图,添加左侧颜色条。
1 _* G* L) }! c, Y6 c/ C1 z# Mfigure% 定义x轴直方图参数xBarParams8 = {'up','facecolor', [0.1,0.1,0.7],'FaceAlpha',0.5};% 定义y轴直方图参数yBarParams8 = {'right','facecolor', [0.1,0.7,0.1],'FaceAlpha',0.5};% 定义热力图参数plotParams8 = {};% 主标题mainTitle8='热力图&直方图';% 使用heatMapHistV函数绘制热力图和直方图[mainDataAxes8, xhistAxes8, yhistAxes8] = heatMapHistV(x, y, 35, 30, 'sctC',plotParams8,xBarParams8 ,yBarParams8 ,mainTitle8);% 设置热力图的颜色映射cmap = jet(65);colormap(mainDataAxes8, cmap);% 添加颜色条hcb =colorbar(mainDataAxes8);% 设置颜色条位置set(hcb, 'Location', 'eastoutside', 'Position', [0.2 0.3 0.02 0.4]); %左侧
/ E ~1 G6 l( f* \% [' p
ep01lcpmvkx64018951558.png
+ ^) j+ Y* D6 f5 j
9、设置ctr绘图属性的等高线图,添加下方颜色条。
& U% a0 S+ h0 z {$ e, }; rfigure% 定义x轴直方图参数xBarParams9 = {'up','facecolor', [0.7,0.1,0.7],'FaceAlpha',0.5};%定义x轴直方图参数yBarParams9 = {'right','facecolor', [0.1,0.7,0.1],'FaceAlpha',0.5};% 定义热力图参数plotParams9 = {'lineWidth',2};% 主标题mainTitle9='热力图&直方图';% 使用heatMapHistV函数绘制热力图和直方图[mainDataAxes9, xhistAxes9, yhistAxes9] = heatMapHistV(x, y, 35, 30, 'ctr',plotParams9,xBarParams9 ,yBarParams9 ,mainTitle9);% 设置热力图的颜色映射cmap = jet(65);colormap(mainDataAxes9, cmap);% 添加颜色条hcb =colorbar(mainDataAxes9);% 设置颜色条位置set(hcb, 'Location', 'northoutside', 'Position', [0.3 0.2 0.4 0.03]); %下
7 N# i7 x1 {$ C' [
odqvgcqkire64018951658.png
! A% K6 u& w$ z% @, f10、设置ctrF绘图属性,填充的等高线图,添加下方颜色条。8 s! P) U6 Z- {! @2 c
figure% 定义x轴直方图参数xBarParams10 = {'up','facecolor', [0.7,0.7,0.7],'FaceAlpha',0.5};% 定义y轴直方图参数yBarParams10 = {'left','facecolor', [0.7,0.7,0.1],'FaceAlpha',0.5};% 定义热力图参数plotParams10 = {'lineWidth',1};% 主标题mainTitle10='热力图&直方图';% 使用heatMapHistV函数绘制热力图和直方图[mainDataAxes10, xhistAxes10, yhistAxes10] = heatMapHistV(x, y, 35, 30, 'ctrF',plotParams10,xBarParams10 ,yBarParams10 ,mainTitle10);% 设置热力图的颜色映射cmap = jet(65);colormap(mainDataAxes10, cmap);% 添加颜色条hcb =colorbar(mainDataAxes10);% 设置颜色条位置set(hcb, 'Location', 'northoutside', 'Position', [0.3 0.2 0.4 0.03]); %下
8 W1 `$ L+ G1 d! S4 t+ m
g4nfh21agx464018951758.png
$ P" ]% G& }7 w+ K) a
11、设置ctrS绘图属性的散点图+等高线图,添加下方颜色条。
: x2 d. A4 n9 s3 y: xfigure% 定义x轴直方图参数xBarParams11 = {'up','facecolor', [0.7,0.1,0.1],'FaceAlpha',0.5};% 定义y轴直方图参数yBarParams11 = {'left','facecolor', [0.1,0.1,0.8],'FaceAlpha',0.5};% 定义热力图参数plotParams11 = {'lineWidth',2};% 主标题mainTitle11='热力图&直方图';% 使用heatMapHistV函数绘制热力图和直方图[mainDataAxes11, xhistAxes11, yhistAxes11] = heatMapHistV(x, y, 35, 30, 'ctrS',plotParams11,xBarParams11 ,yBarParams11 ,mainTitle11);% 设置热力图的颜色映射cmap = summer(65);colormap(mainDataAxes11, cmap);% 添加颜色条hcb =colorbar(mainDataAxes11);% 设置颜色条位置set(hcb, 'Location', 'northoutside', 'Position', [0.3 0.2 0.4 0.03]); %下6 _1 l1 p1 q: j
kab0lbjraio64018951858.png
4 |9 `3 {3 u7 B: B9 ~# f
; x& W1 W! n3 a' p
12、设置bin绘图属性,分 bin 散点图,添加下方颜色条。
6 ^ r7 A5 A/ z' s" ^5 hfigure% 定义x轴直方图参数xBarParams12 = {'up','facecolor', [0.7,0.1,0.1],'FaceAlpha',0.5};% 定义y轴直方图参数yBarParams12 = {'right','facecolor', [0.1,0.7,0.1],'FaceAlpha',0.5};% 定义热力图参数plotParams12 = {};% 主标题mainTitle12='热力图&直方图';% 使用heatMapHistV函数绘制热力图和直方图[mainDataAxes12, xhistAxes12, yhistAxes12] = heatMapHistV(x, y, 35, 30, 'bin',plotParams12,xBarParams12 ,yBarParams12 ,mainTitle12);% 设置热力图的颜色映射cmap = turbo(65);colormap(mainDataAxes12, cmap);% 添加颜色条hcb =colorbar(mainDataAxes12);% 设置颜色条位置set(hcb, 'Location', 'northoutside', 'Position', [0.3 0.2 0.4 0.03]); %下
6 S L5 E! D! |
cphxfblel1g64018951958.png
) L$ a. h5 b$ B" {2 f
13、设置bub绘图属性的气泡热力图7 Z! h+ h! V8 W& o4 K2 F- ~
figure% 定义x轴直方图参数xBarParams13 = {'up','facecolor', [0.8,0.1,0.1],'FaceAlpha',0.5};% 定义y轴直方图参数yBarParams13 = {'right','facecolor', [0.1,0.1,0.8],'FaceAlpha',0.5};% 定义热力图参数plotParams13 = {};% 主标题mainTitle13='热力图&直方图';% 使用heatMapHistV函数绘制热力图和直方图[mainDataAxes13, xhistAxes13, yhistAxes13] = heatMapHistV(x, y, 30, 30, 'bub',plotParams13,xBarParams13 ,yBarParams13 ,mainTitle13);% 设置热力图的颜色映射cmap = hsv(65);colormap(mainDataAxes13, cmap);% 添加颜色条hcb =colorbar(mainDataAxes13);% 设置颜色条位置set(hcb, 'Location', 'northoutside', 'Position', [0.3 0.2 0.4 0.03]); %下
6 `1 s z; _" T7 A1 c
jxp0nwncgw264018952059.png
1 p) [4 N+ r+ c) z$ U6 r7 _! K6 b: R14、设置mh绘图属性的网格热力图,添加左侧颜色条。
2 [5 n! e$ V' F* \" g9 lfigure% 定义x轴直方图参数xBarParams14 = {'up','facecolor', [0.1,0.7,0.1],'FaceAlpha',0.5};% 定义y轴直方图参数yBarParams14 = {'right','facecolor', [0.7,0.1,0.1],'FaceAlpha',0.5};% 定义热力图参数plotParams14 = {};mainTitle14='热力图&直方图';% 使用heatMapHistV函数绘制热力图和直方图[mainDataAxes14, xhistAxes14, yhistAxes14] = heatMapHistV(x, y, 30, 30, 'mh',plotParams14,xBarParams14 ,yBarParams14 ,mainTitle14);% 设置热力图的颜色映射cmap = hsv(65);colormap(mainDataAxes14, cmap);% 添加颜色条hcb =colorbar(mainDataAxes14);% 设置颜色条位置set(hcb, 'Location', 'eastoutside', 'Position', [0.23 0.3 0.02 0.4]); %左侧6 H) i4 B' M2 _7 D( t" G- {. I9 o5 j- J- d0 q
e1igpbfpsqe64018952159.png
' |, @! B4 _" N- D# G \; @ g
15、设置tri绘图属性的三角网格热力图,添加左侧颜色条。
5 e% r9 C O; N, _# c; Vfigure% 定义x轴直方图参数xBarParams15 = {'up','facecolor', [0.1,0.7,0.1],'FaceAlpha',0.5};% 定义y轴直方图参数yBarParams15 = {'right','facecolor', [0.7,0.1,0.1],'FaceAlpha',0.5};% 定义热力图参数plotParams15 = {'EdgeColor','none'};% 主标题mainTitle15='热力图&直方图';% 使用heatMapHistV函数绘制热力图和直方图[mainDataAxes15, xhistAxes15, yhistAxes15] = heatMapHistV(x, y, 30, 30, 'tri',plotParams15,xBarParams15 ,yBarParams15 ,mainTitle15);% 设置热力图的颜色映射cmap = hsv(65);colormap(mainDataAxes15, cmap);% 添加颜色条hcb =colorbar(mainDataAxes15);% 设置颜色条位置set(hcb, 'Location', 'eastoutside', 'Position', [0.23 0.3 0.02 0.4]); %左侧
* |/ o2 x- I ~. g* s8 C
5 W) q" I& M6 ?' l* O% M6 `
dbguy0iczem64018952259.png
4 p0 ?3 _& L% u9 h; ?
16、设置ctrFS绘图属性的填充等高线+散点图,添加下方颜色条。4 t& N3 W3 g M
figure% 定义x轴直方图参数xBarParams16 = {'up','facecolor', [0.7,0.1,0.1],'FaceAlpha',0.5};% 定义y轴直方图参数yBarParams16 = {'left','facecolor', [0.1,0.1,0.8],'FaceAlpha',0.5};% 定义热力图参数plotParams16 = {'EdgeColor','none'};mainTitle16='热力图&直方图';% 使用heatMapHistV函数绘制热力图和直方图[mainDataAxes16, xhistAxes16, yhistAxes16] = heatMapHistV(x, y, 35, 30, 'ctrFS',plotParams16,xBarParams16 ,yBarParams16 ,mainTitle16);% 设置热力图的颜色映射cmap = summer(65);colormap(mainDataAxes16, cmap);% 添加颜色条hcb =colorbar(mainDataAxes16);% 设置颜色条位置set(hcb, 'Location', 'northoutside', 'Position', [0.3 0.2 0.4 0.03]); %下 J5 G) z4 {9 I! O5 y
ic3cmmnw2nf64018952359.png
2 k, I! S* V( W( }) y' s6 s/ P17、设置坐标位置。. c$ `5 D8 T9 s1 J
figurexBarParams17 = {'facecolor', [0.7,0.1,0.1],'FaceAlpha',0.5};yBarParams17 = {'facecolor', [0.1,0.1,0.8],'FaceAlpha',0.5};axesPos= {[0.25 0.25 0.64 0.85], [0.35 0.35 0.35 0.35], [0.35 0.15 0.35 0.2], [0.15 0.35 0.2 0.35]};[mainDataAxes17, xhistAxes17, yhistAxes17] = heatMapHistV(x, y,35, 30,'bub',{},xBarParams17,yBarParams17,{},axesPos);
) }' N( _; r3 ?6 e: E& c- o
uazkbkyvy2i64018952459.png
; @: Y. m- |6 d! @: @; Q! c. n; I- I3 B6 d: B& y: h) A) V
8 i( }9 k- J4 ^+ m工具箱函数代码
0 x8 Q) C. M3 P4 o$ @3 ufunction [mainDataAxes, xhistAxes, yhistAxes] = heatMapHistV(x, y, NbinX, NbinY,typeParams,plotParams, xBarParams, yBarParams,mainTitle, axesPos)% ==============================================================================================% | @Author : 小猪猪 +% | @公众号 : 好玩的MATLAB +% | @Email : 2377389590@qq.com +% +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++% heatMapHistV 绘制二维热力图及其在横纵坐标up的一维直方图% heatMapHistV(x, y, NbinX, NbinY, typeParams, xBarParams, yBarParams, mainTitle, axesPositions)% 绘制二维热力图,同时在横纵坐标up分别绘制一维直方图,NbinX和NbinY分别表示x和y的直方图的bin数。% 输入参数:% x - x轴数据% y - y轴数据% NbinX - x轴直方图bin数% NbinY - y轴直方图bin数% typeParams - 可选,热力图类型,% 'sct'(default值):散点图。在主图up绘制输入数据的散点图。% 'img':图像。在主图up以图像的形式显示二维数据的直方图。% 'srf':表面图。在主图up以三维表面图的形式显示网格点频率。% 'srfN':表面图(无边缘线)。在主图up以三维表面图的形式显示网格点频率,但不显示边缘线。% 'srfNE':表面图(无边缘线、低值隐藏)。在主图up以三维表面图的形式显示网格点频率,但不显示边缘线,且低于阈值的部分设为NaN。% 'sctC':带颜色的散点图。在主图up绘制输入数据的散点图,颜色表示密度。% 'ctr':等高线图。在主图up绘制输入数据的等高线图。% 'ctrF':填充等高线图。在主图up绘制输入数据的填充等高线图。% 'ctrS':带散点的等高线图。在主图up绘制输入数据的等高线图,并显示散点。% 'ctrFS':带散点的填充等高线图。在主图up绘制输入数据的填充等高线图,并显示散点。% 'bin':二维直方图。在主图up显示二维数据的直方图,类似于图像显示,但使用颜色条表示数量。% 'bub':气泡图。在主图up显示气泡图,气泡大小表示密度。% 'pc':伪彩图。在主图up显示伪彩图。% 'mh':网格图。在主图up显示网格图,包括使用TriScatteredInterp方法和griddata方法计算的网格数据。% 'tri':三角剖分图。在主图up显示使用Delaunay三角剖分计算的三维表面图% plotParams - 绘图参数% xBarParams - 可选,x轴直方图可选参数的cell数组,default为 {'facecolor', [.1 .7 .7],% 'edgecolor', [1 1 1],'down'} 其中:可以设置 x轴直方图down:up/down% yBarParams - 可选,y轴直方图可选参数的cell数组,default为 {'facecolor', [.7 .1 .7],% 'edgecolor', [1 1 1],'left'} 其中:可以设置 y轴直方图left:left/right% mainTitle - 可选,主标题,default为空字符串% axesPos - 可选,1x4 cell数组,包含图形窗口、主坐标轴、x轴直方图坐标轴、y轴直方图坐标轴的位置,% default为 {[0.25 0.25 0.64 0.85], [0.35 0.35 0.35 0.35], [0.35 0.1 0.35 0.2], [0.1 0.35 0.2 0.35]}% =============输出参数:==========================================================================================% mainDataAxes - 主热力图的坐标轴句柄% xhistAxes - x轴直方图的坐标轴句柄% yhistAxes - y轴直方图的坐标轴句柄% +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2 E N$ I- I6 enarginchk(0, 10);if nargin 2 z = [repmat([2 4],1000,1) + randn(1000,2)*[1 .5; 0 1.32];... repmat([9 1],1000,1) + randn(1000,2)*[1.4 .2; 0 0.98];... repmat([4 8],1000,1) + randn(1000,2)*[1 .7; 0 0.71];]; x=z(:,1); y=z(:,2);end) [; \4 g% z7 G- k/ `5 o$ z6 m
if length(x) ~= length(y) error('输入参数x和y的长度必须相同');end
- _3 q% D1 r& |; f& V9 y' D" rif nargin 3 NbinX = 20;end
& T& o# |- o! Y% eif nargin 4 NbinY = 20;end
4 j+ W% z7 k' N6 W, s; pif nargin 5 typeParams = 'sct';end
0 O( s- t: y9 T( B- J( C( fif nargin 6 plotParams = {};end7 [ _* x0 }) t6 p$ l
if nargin 7 xBarParams = {'facecolor', [.1 .7 .7], 'edgecolor', [1 1 1],'down'};end
2 z" I/ U) k9 d: _0 s$ X7 xif nargin 8 yBarParams = {'facecolor', [.7 .1 .7], 'edgecolor', [1 1 1],'left'};end. @+ y+ S: U" X @5 w* Y; |) m& i
if nargin 9 mainTitle = '';end
" s) ?, t5 \# y( f% \! c/ cif nargin 10 axesPos ={[0.2500 0.2500 0.5000 0.5000],...% 主图形窗口的位置 [0.3000 0.3000 0.4000 0.4000],... % 主坐标轴(热力图)的位置 [0.3000 0.100 0.4000 0.1500],... % down侧x轴直方图的位置 [0.1000 0.3000 0.1500 0.4000],... % 左侧y轴直方图的位置 };end
0 n( u. @0 l4 x' t7 C2 JhasYR = any(cellfun(@(x) strcmp(x, 'right'), yBarParams));hasYL = any(cellfun(@(x) strcmp(x, 'left'), yBarParams));hasXU = any(cellfun(@(x) strcmp(x, 'up'), xBarParams));hasXD = any(cellfun(@(x) strcmp(x, 'down'), xBarParams));+ a. L5 b7 }& ]0 Y5 N
if hasYL&&hasXD disp(['left,down']) flagYDir='reverse'; flagXDir='reverse'; axesPositions ={[0.2500 0.2500 0.5000 0.5000],...% 主图形窗口的位置 [0.3000 0.3000 0.4000 0.4000],... % 主坐标轴(热力图)的位置 [0.3000 0.1000 0.4000 0.1500],... % down侧x轴直方图的位置 [0.1000 0.3000 0.1500 0.4000]}; % 左侧y轴直方图的位置
/ f. |# E) f6 T; T- U6 y+ O1 U7 Relseif hasYL&&hasXU disp(['left,up']) flagYDir='reverse'; flagXDir='normal'; axesPositions ={[0.2500 0.2500 0.5000 0.5000],...% 主图形窗口的位置 [0.3000 0.3000 0.4000 0.4000],... % 主坐标轴(热力图)的位置 [0.3000 0.7500 0.4000 0.1500],... % up侧x轴直方图的位置 [0.1000 0.3000 0.1500 0.4000]}; % 左侧y轴直方图的位置elseif hasYR&&hasXD disp(['right,down']) flagYDir='normal'; flagXDir='reverse'; axesPositions ={[0.2500 0.2500 0.5000 0.5000],...% 主图形窗口的位置 [0.3000 0.3000 0.4000 0.4000],... % 主坐标轴(热力图)的位置 [0.3000 0.1000 0.4000 0.1500],... % down侧x轴直方图的位置 [0.7500 0.3000 0.1500 0.4000]}; % 右侧y轴直方图的位置elseif hasYR&&hasXU disp(['right,up']) flagYDir='normal'; flagXDir='normal'; axesPositions ={[0.2500 0.2500 0.5000 0.5000],...% 主图形窗口的位置 [0.3000 0.3000 0.4000 0.4000],... % 主坐标轴(热力图)的位置 [0.3000 0.7500 0.4000 0.1500],... % up侧x轴直方图的位置 [0.7500 0.3000 0.1500 0.4000]}; % 右侧y轴直方图的位置elseif ~hasYR&&hasXU flagYDir='reverse'; flagXDir='normal'; axesPositions ={[0.2500 0.2500 0.5000 0.5000],...% 主图形窗口的位置 [0.3000 0.3000 0.4000 0.4000],... % 主坐标轴(热力图)的位置 [0.3000 0.7500 0.4000 0.1500],... % up侧x轴直方图的位置 [0.1000 0.3000 0.1500 0.4000]}; % 左侧y轴直方图的位置elseif hasYR&&~hasXD disp(['right,down']) flagYDir='normal'; flagXDir='reverse'; axesPositions ={[0.2500 0.2500 0.5000 0.5000],...% 主图形窗口的位置 [0.3000 0.3000 0.4000 0.4000],... % 主坐标轴(热力图)的位置 [0.3000 0.1000 0.4000 0.1500],... % down侧x轴直方图的位置 [0.7500 0.3000 0.1500 0.4000]}; % 右侧y轴直方图的位置
. e! O0 J* m0 ^6 ]0 belse disp(['default']) flagYDir='reverse'; flagXDir='reverse'; axesPositions =axesPos;end0 t/ Z5 I, m* y
posxIdx = cellfun(@(x) strcmp(x, 'up'), xBarParams);xBarParams(posxIdx) = [];posyIdx = cellfun(@(x) strcmp(x, 'right'), yBarParams);yBarParams(posyIdx) = [];posxIdx = cellfun(@(x) strcmp(x, 'down'), xBarParams);xBarParams(posxIdx) = [];posyIdx = cellfun(@(x) strcmp(x, 'left'), yBarParams);yBarParams(posyIdx) = [];# b; x' u; s7 y: Y
% 设置图形窗口set(gcf, 'units', 'normalized', 'position', axesPositions{1});
- l; Q5 Z2 i% y, R! }% 创建x轴直方图坐标轴xhistAxes = axes('position', axesPositions{3});% 绘制x轴直方图[N1, c1] = hist(x, NbinX);bar(xhistAxes, c1, N1, xBarParams{:});xlim(xhistAxes, [min(x) max(x)]);set(xhistAxes, 'ydir', flagXDir, 'xticklabel', {}, 'visible', 'off')line(xhistAxes, get(xhistAxes, 'xlim'), [0 0], 'Color', [0 0 0]);& }# c# _/ c2 R% P! L |% h
% 创建y轴直方图坐标轴yhistAxes = axes('position', axesPositions{4});% 绘制y轴直方图[N2, c2] = hist(y, NbinY);barh(yhistAxes, c2, N2, yBarParams{:});ylim(yhistAxes, [min(y) max(y)]);line(yhistAxes, [0 0], get(yhistAxes, 'ylim'), 'Color', [0 0 0]);set(yhistAxes, 'xdir', flagYDir, 'yticklabel', {}, 'visible', 'off');% 创建主坐标轴mainDataAxes = axes('position', axesPositions{2});( H7 W0 ]% [) Z) L
xedges = linspace(min(x), max(x), NbinX);yedges = linspace(min(y), max(y), NbinY);
7 v; O$ }& R& Z% t; S[X,Y]=meshgrid(xedges,yedges);% ++++++++此处思路参考公众号:slandarer随笔+++++++++++++++++++++++++++% web('https://mp.weixin.qq.com/s/b3Qt7Gu0Gqbnoa8AeJit6A')[fi,~]=ksdensity([x,y],[X(:),Y(:)]);Z=reshape(fi,[NbinY,NbinX]);Zi=interp2(X,Y,Z,x,y);
: Y! F) P V! \" k; \levels=linspace(1e-3,max(max(Zi)),15);% ++++++++++++++++++++++++++++++++++++++++++++++++++++++
; y9 {( C S( p! F. FZgriddata = griddata(x,y,Zi,X,Y);triScatterInterp_F = TriScatteredInterp(x,y,Zi,'natural');%scatteredInterpolantZtriScatterInterp = triScatterInterp_F(X,Y);: P& s2 z# W% J& D r) J$ U7 o
% 判断typeParams的类型并绘制相应的图形switch typeParams case 'sct' % 绘制散点图 scatter(mainDataAxes, x, y, 'filled', plotParams{:}); case 'img' % 计算二维直方图 [counts, ~, ~] = histcounts2(x, y, xedges, yedges); counts = counts'; % 使用 imagesc 绘制图像 imagesc(mainDataAxes, xedges, yedges, counts, plotParams{:}); set(mainDataAxes, 'YDir', 'normal');
6 y4 ]* ^6 p, N7 K$ \ case 'srf' % 计算网格点频率 gridEval = computeGridFrequencies(x, y, NbinX, NbinY); % 绘制3D曲面图 surf(mainDataAxes, (xedges(1:end-1) + xedges(2:end)) / 2, (yedges(1:end-1) + yedges(2:end)) / 2, gridEval, plotParams{:}); shading interp; case 'srfN' % 计算网格点频率 gridEval = computeGridFrequencies(x, y, NbinX, NbinY); gridEval(gridEval % 绘制3D曲面图(无网格线) surf(mainDataAxes, (xedges(1:end-1) + xedges(2:end)) / 2, (yedges(1:end-1) + yedges(2:end)) / 2, gridEval, plotParams{:}); case 'srfNE' % 绘制3D曲面图(仅显示一半高度的曲面) surf(X, Y, Z, 'EdgeColor', 'none', plotParams{:}); case 'sctC' % 绘制带颜色的散点图 scatter(mainDataAxes, x, y, 'filled', 'CData', Zi, plotParams{:}); case 'ctr' % 绘制等高线图 contour(X, Y, Z, levels, plotParams{:}); case 'ctrF' % 绘制填充的等高线图 contourf(X, Y, Z,levels, plotParams{:}); case 'ctrS' % 绘制等高线图并叠加散点图 hold on; contour(X, Y, Z, levels, plotParams{:}); scatter(mainDataAxes, x, y, 'filled', 'CData', Zi, plotParams{:}); case 'ctrFS' % 绘制填充的等高线图并叠加散点图 hold on; contourf(X, Y, Z, levels,plotParams{:}); scatter(mainDataAxes, x, y, 3, 'filled', 'MarkerEdgeColor', 'k', 'MarkerFaceColor', 'flat'); case 'bin' % 绘制二维色块图 binscatter(x, y, [NbinX*3 NbinY*3], plotParams{:}); hcb = colorbar; delete(hcb); case 'bub' Z(Z % 绘制气泡图 bubblechart(X(:), Y(:), Z(:), Z(:), plotParams{:}); bubblesize([1, 14]); case 'pc' % 绘制二维色块图 h = pcolor(X, Y, Zgriddata, plotParams{:}); set(h, 'edgecolor', 'none'); case 'mh' % 绘制3D网格图 mesh(X, Y, Zgriddata, plotParams{:}); view(2); case 'tri' % 计算三角剖分 tri = delaunay(X, Y); % 绘制三角形曲面图 trisurf(tri, X, Y, ZtriScatterInterp, plotParams{:}); otherwise % 输出错误信息:没有此类型 disp('没有此类型'); scatter(mainDataAxes, x, y, 'filled', plotParams{:})end
; \- P7 T7 \1 d8 m9 I1 v4 f3 [ax = gca; % 获取当前坐标轴句柄grid on; % 打开网格线box on; % 显示坐标轴边框ax.Title.String = mainTitle; % 设置坐标轴标题ax.LineWidth = 1; % 设置坐标轴线宽ax.XMinorTick = 'on'; % 打开x轴次要刻度线ax.YMinorTick = 'on'; % 打开y轴次要刻度线ax.TickDir = 'out'; % 设置刻度线方向向外ax.GridLineStyle = '--'; % 设置网格线样式为虚线ax.FontSize = 14; % 设置坐标轴字体大小ax.XLim = [min(xedges) max(xedges)]; % 设置x轴坐标范围ax.YLim = [min(yedges) max(yedges)]; % 设置y轴坐标范围view(2); % 设置视图为2D% shading interp;% axis tight;% axis square9 J2 [9 Z O9 S5 C3 |' _
% 计算网格点频率的子函数 function gridEval = computeGridFrequencies(x, y, NbinX, NbinY) xx = linspace(min(x), max(x), NbinX); yy = linspace(min(y), max(y), NbinY); gridEval = zeros(length(yy) - 1, length(xx) - 1); for x_i = 1:length(xx) - 1 for y_i = 1:length(yy) - 1 x_ind = intersect(find(x > xx(x_i)), find(x xy_ind = intersect(find(y(x_ind) > yy(y_i)), find(y(x_ind) gridEval(y_i, x_i) = length(xy_ind); end end endend
1 F7 C4 S8 ?2 J/ D$ L- -THE END- -
% m( G; e' M* H4 |9 J$ ^4 Q, a
5 `; F! p' c! w9 d( q, p% |源码下载:gitee下载:https://gitee.com/iDMatlab/heat-map-hist-v% @- O2 ?" ]' s) d% t% c

. G! Q8 r( Q+ d! V$ Q" m$ t2 C" |. d5 q ^
9 X1 g4 y( Q: H
参考资料: B8 i6 U$ m3 r: q. X
【1】https://mp.weixin.qq.com/s/b3Qt7Gu0Gqbnoa8AeJit6A【2】https://www.mathworks.com/help/matlab/ref/binscatter.html' v# P% S& V5 {3 H5 q* j4 G
9 u* D, E6 M6 s3 C, t; N
. C% h- T) C3 P& [4 A F

" S: z. h- J: W( m' G9 X送书活动, \. j4 t2 v; {; q; U) \
6 i/ [! ?, c% O$ v: j
包邮赠送清华大学出版社赞助《MATLAB数学建模》共3本,感兴趣的朋友推荐入手一本。
2 [0 H0 v/ w2 x9 b: w+ ~$ c h" S9 ~/ z
3 _0 J) w" z. x6 O3 w% ]! C4 h
6 `; q7 I! t9 p; Y
6 @# g: U7 C: y T! ~/ r' P% w扫码领取领优惠劵
3 P& n( G* k3 g9 V8 U$ C
; x% d! A1 j$ d0 _; q0 X
9 L' \, Y, `& j& Z$ j8 D7 ]" c7 P1 F6 |4 L* v& Q
4 @( t2 u) h" Y0 f2 W! {0 \
2 E9 T& X+ r5 G- ^1 U6 }% w' t

3 Z9 b- j0 M# E5 w3 a" {9 v6 a6 W* C( B
活动方式
+ K8 O$ Z @" n
3 ?9 W( s+ u* Q6 {2 Z2 E6 x- O0 v1.关注「好玩的MATLAB 」公众号,加微信:idmatlab;9 Q1 j1 }: ^5 @7 J9 y
2.给本文点【赞】+【在看】;
2 l1 X: @! |+ Z Z7 C) A% C3.转发此推文到朋友圈集赞36个,截图发管理员微信,
1 ` b7 r: g4 h3 |先到先得!$ u" E2 I+ E; D" p. Z
只有3本书!% S1 ^5 ]- O7 T) b; x3 d" ~
后来的没有任何奖品,活动公平公正!公开透明!
# V6 v/ @$ a! K5 A: }0 Q6 ]- z* ?同时满足上述3个条件的读者朋友,包邮赠送一本。3 q; h5 e) X: ~) ?3 C
t8 P) z8 y8 |5 m4 n& ?扫一扫加管理员微信发截图
3 r2 z( W, B5 f' `' Z! Q( G8 ^
. {4 E- s& L2 [# W |
|