2014-01-11 66 views
4

編輯: 好的,所以我通過閱讀更老的問題來回答我自己的問題。我很抱歉問這個問題!使用代碼正常化一個直方圖,並在matlab中使用y軸百分比

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

與相應的數據,而不是隨機數據工作正常。只需要現在優化紙盒尺寸。

美好的一天, 現在我知道你一定在想這已經被問過一千次了。從某種意義上說,你可能是對的,但是我無法從我在這裏找到的帖子中找到我的具體問題的答案,所以我想我可能只是問。我會盡量清楚,但請告訴我,如果它不明顯,我想要做什麼

好吧,所以我有一個5000行的(行)向量,所有這些都只是整數。現在我想要做的是繪製這5000個元素的直方圖,但是這樣一來y軸就有機會進入那個特定的bin,而x軸仍然是正常的,因爲它給出了該特定倉的價值。

現在,對我來說有意義的是將所有事情規範化,但這似乎並不奏效,至少我是如何做到的。

我第一次嘗試是

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

我省略了休息,因爲它進口了大量的數據從一個特定的文件,這其實並不重要。總和=總和(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,它根本沒有標準化。我希望它能真正反映出進入某個垃圾桶的機會。兩者結合也行不通。如果答案非常明顯,我很抱歉,我只是沒有看到它。

編輯:雖然我意識到這是一個單獨的問題(已被問過一百萬次),但我剛用手選取的容器大小,直到它看起來不錯,因爲直方圖中沒有任何柱狀圖。我已經看到了幾種不同的腳本,它們應該優化垃圾箱的大小,但是他們都沒有在每種情況下都製作出「最佳」的直方圖,可悲的是:如果所有數字都是整數?

+1

嗨,大塔你自己找到了答案。在這種情況下,最好的做法是將其添加爲實際答案(下面的框)。這樣,具有相同問題的其他人就可以找到一個整齊的問答式資源。 –

+0

我不知道一直工作的方式來選擇垃圾箱大小。如果你的數據來自一小部分整數,我建議每個數字使用一個bin。對於連續數據,有一種直方圖的替代方法,稱爲內核密度估計('ksdensity'),並且存在用於選擇最佳「分檔寬度」(在該上下文中稱爲帶寬)的算法。 –

+0

並且將自己的答案標記爲已接受,以便該問題不會顯示爲未答覆 –

回答

7

(只是以關閉問題)

直方圖是一個絕對的頻率曲線,從而所有倉頻率之和(歷史函數的輸出矢量的總和)總是在其輸入矢量元素的數量。所以,如果你想有一個輸出,所有你需要做的是將在輸出的每個元素由總數的百分比:

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