You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 19:02:23