2015-02-07 252 views
0

我用python編寫了下面的程序來獲得等寬直方圖。但是當我正在繪製它時,我得到的是一條直線而不是直方圖。有人可以幫我弄清楚我哪裏錯了。用python繪製直方圖

import numpy as np 
import matplotlib.pyplot as plt 

for num in range(0,5): 
    hist, bin_edges = np.histogram([1000, 98,99992,8474,95757,958574,97363,97463,1,4,5], bins = 5) 
    plt.bar(bin_edges[:-1], hist, width = 1000) 
    plt.xlim(min(bin_edges), max(bin_edges)) 
    plt.show() 

此外,我希望標記與從0到5在上面給出的例子value..which範圍雖然我已經保持了我數據恆定其「NUM」獲得的每個情節,但我打算改變我的數據針對不同的「num」值。

回答

1

看看你的bin邊緣:

>>> bin_edges 
array([ 1.00000000e+00, 1.91715600e+05, 3.83430200e+05, 
     5.75144800e+05, 7.66859400e+05, 9.58574000e+05]) 

你的貯藏器位置範圍從1到約100萬,但只給了酒吧1000酒吧你,他們在所有存在的寬度,太瘦身被看到。此外,大多數的酒吧有血清的高度,因爲大多數箱是空的:

>>> hist 
array([10, 0, 0, 0, 1]) 

的「行」你看到的是最後一個窗口,其中一個元素。這個垃圾箱的覆蓋範圍大約爲200000,但是垃圾箱寬度只有1000,所以它相對於它應該覆蓋的空間量非常薄。身高10的酒吧也在那裏,但它也非常瘦,卡住了情節的左邊緣,所以它基本上是看不見的。

嘗試使用等寬條,同時將它們放置在與它們的大小相對應的x座標處也沒有意義。通過將這些小節放在這些x座標處,您已經將它們間距與小紙幣寬度成比例;使酒吧變瘦並不能讓它們靠得更近,這隻會讓它們看不見。

如果要使用等寬條,應將它們放在連續的X位置處,並在軸上使用標籤以顯示分箱表示的值。下面是與您的數據一個簡單的例子:

plt.bar(np.arange(len(bin_edges)-1), hist, width=1) 
plt.xticks((np.arange(len(bin_edges))-0.5)[1:], bin_edges[:-1]) 

enter image description here

你必須決定要如何格式化這些標籤。