首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在matlab中对直方图进行归一化并使y轴以百分比表示

在matlab中对直方图进行归一化并使y轴以百分比表示
EN

Stack Overflow用户
提问于 2014-01-11 21:47:25
回答 1查看 31.5K关注 0票数 7

编辑:好的,我回答了我自己的问题,通过多读一些旧的问题。我很抱歉问了这个问题!使用代码

代码语言:javascript
复制
Y = rand(10,1);
C = hist(Y);
C = C ./ sum(C);
bar(C)

使用相应的数据而不是随机数据工作得很好。现在只需要优化存储箱的大小。

日安,现在我知道你一定在想这个问题已经被问了上千次了。在某种程度上,你可能是对的,但我在这里找到的帖子中找不到我具体问题的答案,所以我想我不妨直接问一下。我会尽量说清楚,但如果不清楚我想要做什么,请告诉我

好的,我有一个有5000个元素的(行)向量,所有的元素都是整数。现在我想要做的是绘制这5000个元素的直方图,但是以这样一种方式,y轴提供了在特定bin中的机会,而x轴仍然是规则的,因为它给出了特定bin的值。

现在,对我来说有意义的是将一切正常化,但这似乎不起作用,至少我是这样做的。

我的第一次尝试是

代码语言:javascript
复制
sums = sum(A);
hist(sums/trapz(sums),50)

我省略了其余部分,因为它从某个文件导入了大量数据,这并不重要。sum= sum(A)可以很好地工作,而且我可以在matlab中看到向量。(我应该叫它什么,控制台?)然而,用trapz除以面积只会改变x轴,而不会改变y轴。所有的东西都变得超级小,大约是10^-3,而它应该是10的量级。

现在环顾四周,有人建议使用

代码语言:javascript
复制
hist(sums,50)
ylabels = get(gca, 'YTickLabel');
ylabels = linspace(0,1,length(ylabels));
set(gca,'YTickLabel',ylabels); 

虽然这肯定会使y轴从0变为1,但它根本没有标准化。我希望它能真实地反映出处于某个垃圾箱中的概率。将两者结合起来也不起作用。如果答案很明显,我很抱歉,我只是看不出来。

编辑:虽然我意识到这是一个独立的问题(这个问题已经被问了一百万次),但我只是手工挑选了条块的大小,直到它看起来很好,因为直方图中没有遗漏任何条。我已经看到了几个不同的脚本,它们应该优化bin大小,但它们似乎没有一个在每种情况下都能做出“最佳”的直方图,可悲的是:(如果所有的数字都是整数,有没有简单的方法来选择大小?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-12 15:38:27

(结束这个问题)

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

代码语言:javascript
复制
x = randn(10000, 1);
numOfBins = 100;
[histFreq, histXout] = hist(x, numOfBins);
figure;
bar(histXout, histFreq/sum(histFreq)*100);
xlabel('x');
ylabel('Frequency (percent)');

如果你想重建数据的概率密度函数,你需要考虑直方图的bin大小,并用频率除以:

代码语言:javascript
复制
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');

更新:

自MATLAB R2014b以来,您可以使用“直方图”命令轻松生成具有各种归一化的直方图。例如,上面的表达式变成:

代码语言:javascript
复制
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');

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21063026

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档