2012-09-07 144 views
2

我在python中創建了一個直方圖,我希望bin邊緣是給定值的百分比(5-10%)。什麼是最好的方法去做這件事,這樣我就不會在箱邊界留下空隙,也不必爲箱邊界計算預先設定一些值。帶有分箱值的百分比的直方圖?

+0

你用什麼來繪製它? pyplot有一個'hist()'函數,可以爲你使用這個函數。 – redrah

+0

我正在使用pyplot,但我需要使用bins = myBins關鍵字給它分類邊界。 Pyplot默認是相同大小的分檔。 – Jen

回答

0

也許我是在簡化您的問題?

def bins(data, nbins): 
    range = max(data) - min(data) 
    binsize = range/float(nbins) 
    bins = [x * binsize for x in range(nbins)] 
+0

你可以做這些重載嗎?當我運行它時,它會返回相同大小的垃圾箱,這不是我想要的。我創建的kludge是創建一個列表,然後使用我想要的百分比追加到列表中:[mybins.append(mybins [i] * percent)for range in(nbins)] – Jen

+1

因此,您希望每個bin都包含10值的百分比?在這種情況下,只需對數組進行排序並獲取每個「(num_elements * 100)/ percentage」元素。 – japreiss

+0

否 - 不是數值的10% - 料箱邊界值爲+/- 10%。 (即,4.5-5.5(倉中心5)或90-110(倉中心100))。 – Jen

1

一般情況下,它的方便創建使用預先定義的工具直方圖像numpy.histogram,雖然你的新發布comment-建議您使用matplotlib-也完全正常。無論哪種方式,您可以創建寬度相等的自動確定箱的集數...

import numpy 
data = [0,1,1,1,1,1,1,2,3,3] 
hist, edges = numpy.histogram(data , bins = 10) 
>>> hist 
array([1, 0, 0, 6, 0, 0, 1, 0, 0, 2]) 
>>> edges 
array([ 0. , 0.3, 0.6, 0.9, 1.2, 1.5, 1.8, 2.1, 2.4, 2.7, 3. ]) 

...或者,在你想預定義倉(可能是不同的寬度)奇數的情況下,你可以指定垃圾桶邊自己(閱讀這是如何工作的信息,文檔):

>>> hist, edges = numpy.histogram(data , bins = [0,.5,1., 1.5,2,3]) 
>>> hist 
array([1, 0, 6, 0, 3]) 
>>> edges 
array([ 0. , 0.5, 1. , 1.5, 2. , 3. ]) 
>>> 

只是要小心使用完全不同塊大小,但是。在許多情況下,這種粗粒化可能會扭曲您嘗試比較的數字之間的關係。

至於你的價值+/- 10%的邊界?

preferred_bin_centers = [0,1,2,3] 
bin_pairs = [ (0.9* v , 1.1*v) for v in preferred_bin_centers ] 
>>> [[0.0, 0.0], [0.9, 1.1], [1.8, 2.2], [2.7, 3.3000000000000003]] 

或者平面化爲可以通過numpy.histogram使用列表的形式...

bin_edges = sum([ [ 0.9* v , 1.1*v ] for v in values ] , []) 

>>> [0.0, 0.0, 0.9, 1.1, 1.8, 2.2, 2.7, 3.3000000000000003] 

(從上面的列表中的前兩項注意,這個代碼給出了混亂倉邊緣如果其中一個倉位中心爲0,則我僅將其作爲要注意的示例)

順便提一下,上面定義的倉邊也會在所需範圍外創建中間倉。例如,如果您將物品放入1,2和3的+/- 10%範圍內,那麼固有地,在2.2和2.7之間(您想要的箱子的「外邊緣」)也會有一個箱子,其中數字爲2.5走。如果您的期望垃圾箱之間存在價值觀,那麼您可能需要相應調整截止點或可視化。

+0

這更接近我尋找的東西 - 你將如何去創造邊界,所以沒有差距? (在您的示例中,例如,2.2和2.7之間存在差距)。 – Jen

+0

@Jen ...這裏固有的問題是這個方法中的邊界值是手動選擇的。這意味着在選擇料箱邊緣時需要非常小心,尤其是因爲+/10%標準會導致較大料箱中心的料箱尺寸變大(1左右的料箱範圍爲0.2,而3左右的料箱具有範圍爲0.6)。等距箱不適合您的數據集有什麼特別的原因嗎?請記住,一些垃圾桶是空的是可以的。 – abought

+0

是 - 由於分辨率條件發生變化,等間距分檔箱不適用。 – Jen