如何在MATLAB直方图中拟合核分布曲线?附脚本优化问询
MATLAB直方图优化与核密度拟合方案
嘿,我来帮你搞定这个MATLAB脚本的问题~
一、'stacked'参数完全没必要!
- 单组数据时,
bar的'stacked'参数纯属多余!它是用来把多组柱状图堆叠展示的,单组数据用它既不会有任何效果,还让代码显得冗余,直接删掉就行。 - 另外原脚本里的
[cntG']转置也没必要,histcounts返回的cntG本身就是适合bar输入的向量,不用多此一举转置。
二、大幅简化原脚本
原脚本手动计算bin中心的步骤可以用更省心的方式替代,甚至直接用histogram函数一步到位,比histcounts+bar的组合简洁太多:
% 简化后的基础直方图脚本 yG = ... % 替换成你的Excel导入数据(比如用readmatrix读取) BinEdges = linspace(0,35,70); figure(1); cla; hold on; % 直接用histogram,自动处理bin划分和计数展示 histogram(yG, 'BinEdges', BinEdges, 'FaceColor', 'lightblue'); xlabel('Length(mm)'); ylabel('Count');
要是你坚持想用histcounts+bar的组合,简化后是这样:
yG = ... % 你的数据 BinEdges = linspace(0,35,70); cntG = histcounts(yG, 'BinEdges', BinEdges); b = BinEdges(1:end-1) + diff(BinEdges)/2; % 这步保留也没问题,但histogram更省事 figure(1); cla; hold on; bar(b, cntG); % 去掉多余的stacked参数和转置 xlabel('Length(mm)'); ylabel('Count');
三、添加核密度(Kernel)拟合曲线
用MATLAB内置的ksdensity函数就能轻松实现,注意要把核密度值转换成和直方图计数匹配的尺度(因为核密度返回的是概率密度,需要乘以数据总数×bin宽度才能和计数对齐):
% 在直方图代码之后添加这段代码即可 % 计算核密度分布 [f, x_values] = ksdensity(yG); % 转换密度尺度,让它和直方图计数匹配 bin_width = diff(BinEdges); bin_width = bin_width(1); % 因为是等宽bin,取第一个宽度就行 total_samples = length(yG); f_scaled = f * total_samples * bin_width; % 绘制核密度拟合曲线 plot(x_values, f_scaled, 'LineWidth', 2, 'Color', 'crimson'); legend('实测数据直方图', '核密度拟合'); % 可选,添加图例更清晰
完整优化后的脚本
yG = ... % 替换为你的Excel导入数据(例如:yG = readmatrix('你的文件.xlsx');) BinEdges = linspace(0,35,70); figure(1); cla; hold on; % 绘制直方图 histogram(yG, 'BinEdges', BinEdges, 'FaceColor', 'lightblue'); % 计算并绘制核密度拟合曲线 [f, x_values] = ksdensity(yG); bin_width = diff(BinEdges); f_scaled = f * length(yG) * bin_width(1); plot(x_values, f_scaled, 'LineWidth', 2, 'Color', 'crimson'); % 标注与美化 xlabel('Length(mm)'); ylabel('Count'); legend('实测数据直方图', '核密度拟合曲线'); grid on; % 可选,添加网格让图更易读
内容的提问来源于stack exchange,提问作者K.C. Timothy YICK




