【问题标题】:Normalizing a histogram and having the y-axis in percentages in matlab标准化直方图并在matlab中以百分比表示y轴
【发布时间】:2014-01-30 12:44:00
【问题描述】:

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

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

使用相应的数据而不是随机数据可以正常工作。现在只需要优化 bin 大小。

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

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

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

我的第一次尝试是

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

我省略了其余部分,因为它从某个文件中导入了大量数据,这并不重要。 sums = sum(A) 工作正常,我可以在我的 matlab thingy 中看到向量。 (我应该怎么称呼它,控制台?)。但是,用 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。对于连续数据,有一个直方图的替代方法,称为核密度估计 (ksdensity),并且存在选择最佳“bin 宽度”(在该上下文中称为带宽)的算法。
  • 并将您自己的答案标记为已接受,这样问题就不会显示为未回答
  • 是的,很遗憾,我在发布问题 8 小时后才能回答自己的问题,否则我会回答的!我会在下一次发布之前尝试做更多的搜索,但根据我的经验,它总是倾向于在你放弃后找到一些恰到好处的东西

标签: matlab histogram


【解决方案1】:

(只是为了结束问题)

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

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

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

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 开始,您可以使用“直方图”命令轻松生成具有各种归一化的直方图。比如上面变成:

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');

【讨论】:

    猜你喜欢
    • 2013-12-27
    • 1970-01-01
    • 2017-10-05
    • 1970-01-01
    • 2012-07-30
    • 1970-01-01
    • 1970-01-01
    • 2019-09-30
    相关资源
    最近更新 更多