在Matlab中将直方图归一化并将y轴表示为百分比

7

编辑: 好的,我通过阅读旧的问题自己找到了答案。对于我的问题表示歉意!使用以下代码:

Y = rand(10,1);
C = hist(Y);
C = C ./ sum(C);
bar(C)

将随机数据替换为相应的数据就可以正常工作了。现在只需要优化箱子大小。

你好,我知道你一定会觉得这个问题已经被问了上千遍。在某种程度上,你可能是对的,但我在这里找到的帖子中没有找到我特定问题的答案,所以我觉得我最好还是问一下。我会尽可能清楚地表达,但如果我的意图不明显,请告诉我。

好吧,我有一个向量(行)具有5000个元素,所有元素都是整数。现在我想做的是绘制这5000个元素的直方图,但是以这样的方式进行绘制,y轴显示在该特定箱子中的概率,而x轴仍然是普通的,因为它显示该特定箱子的值。

现在,对我来说有意义的是标准化所有内容,但是这似乎不起作用,至少不是我正在做的方式。

我的第一次尝试是

sums = sum(A);
hist(sums/trapz(sums),50)

我省略了其余的内容,因为它从某个文件中导入了大量数据,这并不重要。sum(A)可以正常工作,我可以在我的Matlab控制台中看到向量。(我应该怎么称呼它,控制台?)。但是,使用trapz除以面积只会改变我的x轴,而不是y轴。所有值都变得非常小,约为10^-3,而它应该是10的数量级。

现在看起来,有人建议使用

hist(sums,50)
ylabels = get(gca, 'YTickLabel');
ylabels = linspace(0,1,length(ylabels));
set(gca,'YTickLabel',ylabels); 

尽管这确实使y轴从0到1,但根本没有归一化。我希望它实际上反映出处于某个bin中的机会。将两者结合也不起作用。如果答案非常明显,我表示歉意,我只是看不到它。
编辑:虽然我意识到这是一个单独的问题(已经被问了无数次),但我手动选择了bin大小,直到它看起来很好,就是直方图中没有缺失的条形。我见过几个不同的脚本,可以优化bin大小,但遗憾的是,它们中的任何一个似乎都不能在每种情况下制作出“最佳”的直方图 :( 如果所有数字都是整数,有没有简单的方法来选择大小?

1
嗨,很高兴你自己找到了答案。在这种情况下,最好的做法是将其添加为实际答案(下面的框)。这样,其他有同样问题的人就可以找到一个整洁的问答式资源。 - A. Donda
我不知道一种始终有效的方法来选择箱子大小。如果您的数据来自一小组整数,我建议每个数字使用一个箱子。对于连续数据,有一种称为核密度估计(ksdensity)的直方图替代方法,并且存在算法来选择最佳的“箱宽”(在该上下文中称为带宽)。 - A. Donda
并标记您自己的答案为已接受,以便问题不会显示为未回答。 - Luis Mendo
2
是的,可惜我要在发布问题后8个小时才能回答自己的问题,否则我就可以了!下次在发布之前我会尽量多搜索一些,但根据我的经验,总是在你放弃之后才会找到恰到好处的东西。 - user129412
1个回答

9

(仅为结束问题)

直方图是一个绝对频率图,因此所有箱频率的总和(hist函数的输出向量的总和)始终是其输入向量中元素的数量。因此,如果您想要百分比输出,您需要做的就是将输出中的每个元素除以该总数:

x = randn(10000, 1);
numOfBins = 100;
[histFreq, histXout] = hist(x, numOfBins);
figure;
bar(histXout, histFreq/sum(histFreq)*100);
xlabel('x');
ylabel('Frequency (percent)');

enter image description here

如果你想重构数据的概率密度函数,需要考虑直方图的区间宽度,并将频率除以它:

x = randn(10000, 1);
numOfBins = 100;
[histFreq, histXout] = hist(x, numOfBins);
binWidth = histXout(2)-histXout(1);
figure;
bar(histXout, histFreq/binWidth/sum(histFreq));       
xlabel('x');
ylabel('PDF: f(x)');
hold on
% fit a normal dist to check the pdf
PD = fitdist(x, 'normal');
plot(histXout, pdf(PD, histXout), 'r');

enter image description here


更新:

自从MATLAB R2014b版本以后,您可以使用“histogram”命令轻松地生成具有各种标准化的直方图。例如,上面的内容变为:

x = randn(10000, 1);
figure;
h = histogram(x, 'normalization', 'pdf');
xlabel('x');
ylabel('PDF: f(x)');
hold on
% fit a normal dist to check the pdf
PD = fitdist(x, 'normal');
plot(h.BinEdges, pdf(PD, h.BinEdges), 'r');

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接