如何在Matlab中绘制共享同一PDF、不同颜色的双数据集直方图?
问题
现有两个规模相差约10倍的向量,需要在概率分布函数(PDF)直方图中用不同颜色分别展示,但PDF需基于整个数据集计算归一化。当前使用histogram(data, 'Normalization', 'pdf')时,两个数据集会各自独立归一化,无法体现整体分布中的真实占比。
解决方案
核心思路是先基于合并后的全部数据确定统一的直方图分箱区间,再分别统计两个数据集在各区间内的频数,最后根据整体数据的总样本量和区间宽度计算符合全局PDF的数值,实现基于整体的归一化展示。
具体步骤及代码如下:
% 生成样本数据 dist1 = normrnd(-2,1, [1, 750]); % 规模较小的向量 dist2 = normrnd(2,1, [1, 12000]); % 规模较大的向量 all_data = [dist1, dist2]; % 合并整体数据集 % 步骤1:基于整体数据计算统一的分箱区间 num_bins = 30; % 可根据需求调整分箱数量 [~, bin_edges] = histcounts(all_data, num_bins); % 步骤2:分别统计两个数据集在各区间的频数 counts1 = histcounts(dist1, bin_edges); counts2 = histcounts(dist2, bin_edges); % 步骤3:计算基于整体数据的PDF归一化因子 total_samples = length(all_data); bin_width = diff(bin_edges); pdf_normalizer = total_samples .* bin_width; % 步骤4:计算两个数据集基于整体的PDF值 pdf1 = counts1 ./ pdf_normalizer; pdf2 = counts2 ./ pdf_normalizer; % 绘制直方图(用bar实现分颜色展示) hold on bar(bin_edges(1:end-1), pdf1, 'BarWidth', 1, 'FaceColor', 'r', 'EdgeColor', 'r'); bar(bin_edges(1:end-1), pdf2, 'BarWidth', 1, 'FaceColor', 'b', 'EdgeColor', 'b'); % 若需要堆叠展示整体分布构成,可在bar函数中添加 'Stacked' 参数 % 添加图例与标签 legend('dist1', 'dist2') xlabel('数据值') ylabel('概率密度(PDF)') hold off
关键说明
- 统一分箱区间:确保两个数据集的直方图分箱完全一致,避免因分箱差异导致的展示偏差。
- 全局归一化:用整体数据的总样本量计算归一化因子,让两个数据集的PDF值反映其在整体分布中的真实占比,而非各自独立的分布比例。
- 灵活展示:使用
bar函数可方便设置不同颜色,若需堆叠展示整体PDF的构成,只需在bar中添加'Stacked'参数即可。
内容的提问来源于stack exchange,提问作者Andrew M
相关产品推荐
相关产品推荐

