MATLAB:如何使2个直方图具有相同的bin宽度?

时间:2014-09-18 14:34:44

标签: matlab histogram bins

我正在用Matlab绘制1个图中2个分布的2个直方图。但是,结果显示2个直方图不具有相同的bin宽度,尽管我对bin使用相同的数字。我们如何使2个直方图具有相同的箱宽?

我的代码很简单:

a = distribution one
b = distribution two
nbins = number of bins
[c,d] = hist(a,nbins);
[e,f] = hist(b,nbins);
%Plotting
bar(d,c);hold on;
bar(f,e);hold off;

3 个答案:

答案 0 :(得分:1)

这可以通过简单地使用从一个调用到hist的bin中心作为另一个的bin来实现

例如

[aCounts,aBins] = hist(a,nBins);
[bCounts,bBins] = hist(b,aBins);

请注意all(aBins==bBins) = 1


当两个数据集的最小值和最大值不相似时,此方法会丢失信息*,一个简单的解决方案是根据组合数据创建容器

[~ , bins] = hist( [a(:),b(:)] ,nBins);
aCounts = hist( a , bins );
bCounts = hist( b , bins );

*如果范围差异很大,那么手动创建bin中心的向量可能会更好


(重新阅读问题后)如果您希望控制箱宽度不使用相同的箱子,那么手动创建箱子中心可能是最好的......

这样做会创建一个bin中心向量来传递给hist,

例如

- 请注意,此处仅对一组数据强制执行二进制数

aBins = linspace( min(a(:)) ,max(a(:) , nBins);
binWidth = aBins(2)-aBins(1);
bBins = min(a):binWidth:max(b)+binWidth/2

然后使用

aCounts = hist( a , aBins );
bCounts = hist( b , bBins );

答案 1 :(得分:1)

使用带有' BinWidth'的histcounts选项

https://www.mathworks.com/help/matlab/ref/histcounts.html

data1 = randn(1000,1)*10;
data2 = randn(1000,1);
[hist1,~] = histcounts(data1, 'BinWidth', 10);
[hist2,~] = histcounts(data2, 'BinWidth', 10);


bar(hist1)
bar(hist2)

答案 2 :(得分:0)

当第二个参数是向量而不是标量时,hist的行为是不同的。

不是指定多个分档,而是使用向量指定分箱限制,如documentation中所示(请参阅" 指定分区间隔"):

rng(0,'twister')
data1 = randn(1000,1)*10;
rng(1,'twister')
data2 = randn(1000,1);

figure
xvalues1 = -40:40;
[c,d] = hist(data1,xvalues1);
[e,f] = hist(data2,xvalues1);

%Plotting
bar(d,c,'b');hold on;
bar(f,e,'r');hold off;

这导致:

If you look closely, the blue bar tops are still visible "behind" the red