标准化直方图并在matlab中使y轴以百分比表示

use*_*412 6 matlab histogram

编辑:好的,所以我回答了我自己的问题,通过阅读更旧的问题.我为提问而道歉!使用代码

Y = rand(10,1);
C = hist(Y);
C = C ./ sum(C);
bar(C)
Run Code Online (Sandbox Code Playgroud)

用相应的数据代替随机数据工作正常.现在只需要优化箱子大小.

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

好吧,所以我有一个带有5000个元素的(行)向量,所有这些都只是整数.现在我要做的是绘制这些5000个元素的直方图,但是这样的方式使得y轴可以存在于某个特定的区域中,而x轴仍然是常规的,就像它给出了特定箱子的价值.

现在,对我来说有意义的是规范化一切,但这似乎不起作用,至少我是怎么做的.

我的第一次尝试是

sums = sum(A);
hist(sums/trapz(sums),50)
Run Code Online (Sandbox Code Playgroud)

我省略了其余部分,因为它从某个文件中导入了大量数据,这并不重要.sums = 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); 
Run Code Online (Sandbox Code Playgroud)

虽然这肯定会使y轴从0变为1,但它根本没有标准化.我希望它能真正反映出进入某个垃圾箱的可能性.将两者结合起来也行不通.如果答案非常明显,我道歉,我只是不明白.

编辑:虽然我意识到这是一个单独的问题(已被问过一百万次),但我只是手工采摘的箱子大小,直到它看起来很好,因为直方图中没有任何条形码丢失.我已经看过几个不同的脚本应该优化bin大小,但是它们似乎都没有在每种情况下制作出"最佳"的直方图,遗憾的是:(有没有一种简单的方法来选择大小,如果所有数字都是整数?

Omi*_*idS 8

(只是为了结束这个问题)

直方图是绝对频率图,因此所有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)');
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

如果要重建数据的概率密度函数,则需要考虑直方图的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');
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


更新:

从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');
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述