|

点击上方蓝字和“好玩的MATLAB”一起快乐玩耍吧! {+ \3 @/ X/ E$ s4 t* ]9 j
- T9 V. g u& O0 u9 c. h% P0 L
rqjbvyrhpeu64018950556.jpg
3 d( P, Y- S/ z好玩的matlab
+ l" R* a# ~# K- e5 s& j带你解锁不一样的matlab新玩法
& n( X N5 @: h1 X2 v; ^$ W! P- X. | A% ^: u& S
今天教大家怎么绘制热力直方图,喜欢此推文的小伙伴们记得点赞+关注+分享!
7 o+ e8 g5 H+ C9 X热力直方图是一种结合了热力图和直方图的数据可视化方法,它能够更加全面地展示数据的分布特征和关联性。在某些应用场景中,使用热力直方图优势:直观展示数据密度:热力图部分可以直观地显示数据在二维空间中的分布密度。颜色越暗或越亮表示数据密度越高,这有助于快速识别数据的聚集区域和稀疏区域。揭示变量间关系:热力直方图可以帮助我们观察两个变量之间的关系。通过分析热力图中颜色的分布和变化,我们可以发现两个变量之间的相关性或者潜在的模式。边缘分布信息:直方图部分显示了各个变量的边缘分布,这有助于我们了解单个变量的分布特征,例如数据的中心趋势、离散程度以及潜在的异常值。直观的多维数据展示:热力直方图可以在一个图形中展示多个维度的信息。这使得我们能够更加方便地比较、分析和解释数据。定制性强:热力直方图可以根据需要定制不同的颜色方案、绘制风格和布局。这使得它能够适应各种场景,满足不同的分析需求。[/ol]效果图
7 n7 N8 _) b$ o* h
) r6 u6 \! i) d
hksskzgb3ix64018950656.png
. `( u. H* f9 ^( s) S* W
2 ?9 f; ]7 H m: c/ p2 ]( q5 p
zstcdz1svsp64018950756.png
7 ?% E* Y, ^1 K- h' a9 y8 @
5 [1 z6 H6 l+ s7 d详细教程
% M. N: |! @& D! P$ p2 m数据设置0 }7 l4 s: C0 k- h* e m$ V
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、默认参数绘图
0 J' X6 O$ x8 r0 P' R& T" H/ ?figure[mainDataAxes1, xhistAxes1, yhistAxes1] = heatMapHistV(x, y);
* p$ X! R4 F- h/ y# i4 N. Y
nmlbhvgo1yo64018950856.png
% Q. I1 @" s8 a- K0 r1 i" A; I2、绘制sct属性的散点图,设置直方图的颜色、位置。
' H) q. r5 e3 I0 O2 C- ofigure% 定义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);
" |/ ~0 `, ^+ p
kmjyveg3bon64018950956.png
2 g( M9 r" b V4 T3、设置img绘图属性 ,添加标题,设置右侧的颜色条。
4 d( j0 F/ n3 L; ofigure% 定义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]); % 右侧
b* `+ _, B3 w0 L! ]
f3awgyhqfok64018951057.png
' L7 M0 J1 E4 J( R4、设置srf绘图属性,设置右侧颜色条。2 l X8 T* T# {
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]);6 h; M' {" ~ ]0 R. c* Y
bkpvyzhtcqx64018951157.png
# _! Y; j+ U0 O8 V( U5、设置srfN绘图属性,设置上侧颜色条。
, w7 M0 x7 L* ^$ e% V. I( H, ^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]);+ h0 q5 v7 V; I$ X
q1drc2tiisw64018951257.png
5 \! V, b' n M7 V; S6、设置srfN绘图属性,设置左侧颜色条。6 _8 m, C- }/ w" s( g8 \& t" J
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]); %左侧
6 g: |- M7 R% s3 \+ y/ K5 K
dkgf4krwivg64018951357.png
d( L7 d! Q& x5 u# U* V8 n: [
7、设置srfNE绘图属性,设置左侧颜色条。
# d5 F; ~4 j0 i/ ifigure% 定义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]); %右侧8 c0 D+ U6 T8 @ m
u4vtgvac5l364018951457.png
/ j4 ^5 N R) B6 a4 d7 B
8、设置sctC绘图属性的散点热力图,添加左侧颜色条。
0 `) }+ K% v8 R+ S; f+ `figure% 定义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]); %左侧2 t, f# p& J% `
ep01lcpmvkx64018951558.png
% ]: ^5 O' L$ w0 F8 \! Y9、设置ctr绘图属性的等高线图,添加下方颜色条。& s) b/ c7 ~( Z+ ?1 c D. U& a
figure% 定义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]); %下/ ?0 [6 }6 f7 y+ V
odqvgcqkire64018951658.png
" c- S; s7 {' V; j. b/ {
10、设置ctrF绘图属性,填充的等高线图,添加下方颜色条。+ r+ w- P1 `' n0 F c$ F, i6 U4 j
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]); %下
$ c; h# \" c. l, y- e
g4nfh21agx464018951758.png
! Y& X5 t2 T5 f8 o+ s11、设置ctrS绘图属性的散点图+等高线图,添加下方颜色条。
0 S, e6 ~. r' m" H# W; \9 pfigure% 定义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]); %下
) @; S i% u6 ]4 |( B0 v4 B2 ], n
kab0lbjraio64018951858.png
8 C$ S2 u+ ~! Z* \% ^ l- P
9 p6 i1 \2 m. a* L+ ?: s5 s12、设置bin绘图属性,分 bin 散点图,添加下方颜色条。7 n7 @* M1 r/ \+ X* c6 I
figure% 定义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]); %下" C, D: L+ w0 ~, G" w6 c
cphxfblel1g64018951958.png
. S+ w8 z& P1 J0 C7 g* @* T
13、设置bub绘图属性的气泡热力图
% S2 ^: Z' a" t& m! x1 k1 x! |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]); %下9 P- f1 Q' I. |/ l5 g {
jxp0nwncgw264018952059.png
8 v- y7 @5 Y+ p3 Y14、设置mh绘图属性的网格热力图,添加左侧颜色条。
7 b5 g; D' |; L2 Mfigure% 定义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]); %左侧2 r' p( Q6 X2 j3 P# X4 G8 V1 \
e1igpbfpsqe64018952159.png
5 B0 {# K/ v4 B9 L15、设置tri绘图属性的三角网格热力图,添加左侧颜色条。
{# B- Q2 P/ R6 B/ Sfigure% 定义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]); %左侧! C$ }9 L `* X% L) v
$ }0 }8 k: ]; |1 N3 z
dbguy0iczem64018952259.png
3 Y/ J% Y) L; [. p$ t16、设置ctrFS绘图属性的填充等高线+散点图,添加下方颜色条。
5 H1 M8 L& F: {& a7 v* w& Lfigure% 定义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]); %下
' W+ _! n3 `4 p4 [+ T
ic3cmmnw2nf64018952359.png
# l3 S+ v! M4 N0 `$ h2 Y1 o' p17、设置坐标位置。6 }/ P( q; c! \# s1 u M
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);
$ C6 m3 n. G0 k9 _2 v4 R# l
uazkbkyvy2i64018952459.png
, n. R8 ]* q9 O" m' A8 b
% K( e; B& |4 I+ g2 V" e' |* E8 F' T
工具箱函数代码: Z6 n% `5 _% k
function [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轴直方图的坐标轴句柄% +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++' E# D$ g8 Q. E) g r
narginchk(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
8 S' u& U: `; L' e9 J5 Yif length(x) ~= length(y) error('输入参数x和y的长度必须相同');end8 S. X- A( i( O) [2 z% g, ?
if nargin 3 NbinX = 20;end
, b& `6 b }% M- B0 V- oif nargin 4 NbinY = 20;end& P$ \. w; m2 m3 o$ D
if nargin 5 typeParams = 'sct';end( w4 B9 n$ O; s- ^. O, l
if nargin 6 plotParams = {};end$ s% `. D- X& l* w
if nargin 7 xBarParams = {'facecolor', [.1 .7 .7], 'edgecolor', [1 1 1],'down'};end+ [$ {% K" ?6 C. V9 S6 V/ E9 [
if nargin 8 yBarParams = {'facecolor', [.7 .1 .7], 'edgecolor', [1 1 1],'left'};end/ n4 f& A. |8 f* T( F4 x/ G5 f
if nargin 9 mainTitle = '';end
0 T; q9 z* @- l& i# y0 |' k, x9 y" iif 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
( X% W5 ~8 t" g0 T+ l) UhasYR = 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));
# r9 n( p2 V# k) ~; C2 C& d" dif 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轴直方图的位置
/ @7 v! o4 m! R+ Xelseif 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轴直方图的位置
9 g- k. U* [7 Felse disp(['default']) flagYDir='reverse'; flagXDir='reverse'; axesPositions =axesPos;end1 m) ~1 B, P! H# o7 q- q+ X
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) = [];
; Z$ H! G% w$ _7 }4 `0 ]! K; ^% 设置图形窗口set(gcf, 'units', 'normalized', 'position', axesPositions{1});1 B5 `' M' Y" o9 w) P
% 创建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]);5 m9 f2 H# T+ o" [9 C
% 创建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});
& Q! F# L& a% A9 T6 h, b Hxedges = linspace(min(x), max(x), NbinX);yedges = linspace(min(y), max(y), NbinY);7 E( }- o/ I$ g8 W# A1 K- o
[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);8 H f! d8 x; D" Q
levels=linspace(1e-3,max(max(Zi)),15);% ++++++++++++++++++++++++++++++++++++++++++++++++++++++. N* h/ K U! e q: S! L/ U; P
Zgriddata = griddata(x,y,Zi,X,Y);triScatterInterp_F = TriScatteredInterp(x,y,Zi,'natural');%scatteredInterpolantZtriScatterInterp = triScatterInterp_F(X,Y);, }/ [ d1 U, t1 H3 j: s& c% ?( J
% 判断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');( z, J5 R$ v) v8 ]2 C
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- g [# e2 t* C
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 square# f o! T7 f! x4 {
% 计算网格点频率的子函数 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' t% |( w5 Q K* q: v. U% V/ r0 J
- -THE END- -
: P, U" D- E; p9 X+ t; R- |$ ?, |- H
源码下载:gitee下载:https://gitee.com/iDMatlab/heat-map-hist-v
- S. Z9 }6 x2 k$ Q" W* ~- l ' n; F% \$ U0 \2 J% r5 g
. h: v! T. N! H# d. _. S
) O/ s) a. X( O+ g) S9 w; p) j参考资料:: G' T0 e) w+ ?; \
【1】https://mp.weixin.qq.com/s/b3Qt7Gu0Gqbnoa8AeJit6A【2】https://www.mathworks.com/help/matlab/ref/binscatter.html
- f1 H- |) M1 @4 f% j/ {0 r! [3 n& {% t2 Q$ R
( A6 W' f& P; c' r7 m7 @4 c

( L0 Y. S N+ t8 x5 L' H: p# Z送书活动
+ ?& @7 N$ z o2 H. }+ |0 O: A* P" U H; c9 w$ ]# n" p" z
包邮赠送清华大学出版社赞助《MATLAB数学建模》共3本,感兴趣的朋友推荐入手一本。; W9 @" \) H4 p7 S0 d0 q
, S9 d# }; f: M- o# g* l$ B6 T
5 S; f- s' J4 D0 U
7 O+ a/ c; u# g# ?, a3 _7 \& u
' i" n9 r4 t& H, I扫码领取领优惠劵
9 f2 |4 N6 X8 b m% x7 c
" n( V' v3 E5 g2 m. S% t7 @4 t 3 i8 _! |% h8 M6 e
# g. \" y, z% u4 D) T$ p2 J ~
. j" ]& w) L9 a5 g% P' h" r. U# E9 ^* |; w& |# W
- V3 _% v8 ~. H4 [: H1 w/ } R# ^
+ v/ c+ Z4 P3 D- q
活动方式
2 C9 g; q- f( c$ z* q F. Q
! a( n; g# P' ^1.关注「好玩的MATLAB 」公众号,加微信:idmatlab;
$ ^* c# S; f( b% d2.给本文点【赞】+【在看】;
) G: ?% X- z/ S. { Q3.转发此推文到朋友圈集赞36个,截图发管理员微信,
+ t& {9 Y6 a6 x: n7 y先到先得!5 T8 T- ?8 J+ l }
只有3本书!8 s! a' x* S# r: {: l8 U- `
后来的没有任何奖品,活动公平公正!公开透明!
5 p7 q7 V3 G/ @& k同时满足上述3个条件的读者朋友,包邮赠送一本。
1 Z R6 [; X2 h* _8 b- Z1 _$ c: v0 L, ?! ~$ H
扫一扫加管理员微信发截图
! _! Q( _7 L) N4 W: ^: y 9 p- h0 B6 L) V O
|
|