Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在matlab中对直方图进行规格化并以百分比表示y轴_Matlab_Histogram - Fatal编程技术网

在matlab中对直方图进行规格化并以百分比表示y轴

在matlab中对直方图进行规格化并以百分比表示y轴,matlab,histogram,Matlab,Histogram,编辑: 好的,我回答了我自己的问题,通过多读一些老问题。我很抱歉问这个问题!使用代码 Y = rand(10,1); C = hist(Y); C = C ./ sum(C); bar(C) 用相应的数据代替随机数据,效果良好。现在只需要优化垃圾箱的大小 你好, 现在我知道你一定认为这个问题已经被问过一千次了。在某种程度上,你可能是对的,但我无法从我在这里找到的帖子中找到我的具体问题的答案,所以我想我不妨问问。我会尽量说清楚,但如果不清楚我想做什么,请告诉我 好的,我有一个包含5000个元素的

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

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)
我省略了其余部分,因为它从某个文件导入了大量数据,这并不重要。sums=sumA工作正常,我可以在我的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,但它根本没有标准化。我希望它能真实地反映在某个垃圾桶里的机会。将两者结合起来也不起作用。我很抱歉,如果答案很明显,我就是看不出来


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

只是为了结束这个问题

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

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

你好,很高兴你自己找到了答案。在这种情况下,最好将其添加为下面的实际答案框。通过这种方式,其他有同样问题的人可以找到一个简洁的问答式资源。我不知道有一种始终如一的工作方式来选择垃圾箱的大小。如果您的数据来自一小部分整数,我建议每个数字使用一个bin。对于连续数据,有一种替代直方图的方法,称为核密度估计ksdensity,在这种情况下,有一种算法可以选择称为带宽的最佳箱子宽度。并将您自己的答案标记为已接受,这样问题就不会显示为未回答,不幸的是,我不能回答我自己的问题,直到8小时后张贴,否则我会!在下一次发帖之前,我会尝试做更多的搜索,但根据我的经验,你总是会在放弃后找到一些恰好合适的东西