2014-04-25 58 views
1

我想繪製一個簡單的直方圖並行多個數據。
我的數據是一組二維圖像,它們都具有相同的尺寸(在本例中爲256 x 256)。酒吧高度和寬度在幾個數據的直方圖陰謀

我有這樣的方法來繪製數據集:

def plot_data_histograms(data, bins, color, label, file_path): 
     """ 
     Plot multiple data histograms in parallel 
     :param data : a set of data to be plotted 
     :param bins : the number of bins to be used 
     :param color : teh color of each data in the set 
     :param label : the label of each color in the set 
     :param file_path : the path where the output will be save 
     """ 
     plt.figure() 
     plt.hist(data, bins, normed=1, color=color, label=label, alpha=0.75) 
     plt.legend(loc='upper right') 
     plt.savefig(file_path + '.png') 
     plt.close() 

而且我通過我的數據如下:

data = [sobel.flatten(), prewitt.flatten(), roberts.flatten(), scharr.flatten()] 
labels = ['Sobel', 'Prewitt', 'Roberts Cross', 'Scharr'] 
colors = ['green', 'blue', 'yellow', 'red'] 

plot_data_histograms(data, 5, colors, labels, '../Visualizations/StatisticalMeasures/RMSEHistograms') 

而且我得到了這個柱狀圖:

histogram

我知道這可能是愚蠢的,但我沒有明白爲什麼我的yticks從0到4.5不等。我知道這是由於規範參數,但即使閱讀此;

如果True,返回的元組的第一個元素將是歸一化以形成一個概率密度,即n/(len(x)*dbin)計數 。在概率密度爲 時,直方圖的積分應爲1;你可以用一個梯形積分來驗證密度函數的概率 。

我真的不明白它是如何工作的。

而且,一旦設置我的等於五直方圖剛好有5個xticks(不含邊界),我不明白爲什麼我有一些thicks中間一些吧,像0.6厚的黃色。由於我的箱數xticks匹配,我雖然每組四個條應該集中在每個區間內,就像它發生在四個第一個條,完全集中在[0.0,0.2]區間內。

預先感謝您。

回答

2

這是令人困惑的原因是因爲你正在一個圖上壓扁四個直方圖。爲了做到這一點,matplotlib選擇縮小酒吧,並在他們之間留下空隙。在標準直方圖中,如果normedN,所有垃圾箱的總面積爲1。這裏有一個簡單的例子:

a = np.random.rand(10) 
bins = np.array([0, 0.5, 1.0]) # just two bins 
plt.hist(a, bins, normed=True) 

normed

首先要注意的是,每個條涵蓋其斌的整個範圍:第一條範圍從00.5,它的高度是由點的數量給予在那個範圍內。
接下來,您可以看到兩個柱的總面積爲1,因爲normed = True:每個柱的寬度爲0.5,高度爲1.20.8

我們繪製與其他分佈再次同樣的事情,這樣你就可以看到效果:

b = np.random.rand(10) 
plt.hist([a, b], bins, normed=True) 

normed with two

回想一下,藍色的條形代表完全相同的數據作爲第一個情節,但他們現在的寬度還不到一半,因爲它們必須爲綠色酒吧騰出空間。你可以看到,現在兩個酒吧一些空白覆蓋了每個垃圾箱的範圍。所以我們必須假設每個小節的寬度實際上是所有小節的寬度加上空白間隔的寬度,當我們計算小節範圍和小節區時。

最後,請注意無處xticks與binedges對齊。如果你願意,你可以將其設置爲手動如此,有:

plt.xticks(bins) 

如果沒有手動創建bins首先,你可以從plt.hist抓住它:

counts, bins, bars = plt.hist(...) 
plt.xticks(bins) 
+0

謝謝你的詳細的答案。 (: – pceccon