2012-09-05 187 views
6

我想使用matplotlib繪製部分直方圖。matplotlib規範直方圖

而不是繪製具有很多異常值和較大值的整個直方圖,我只想關注一小部分。原來的柱狀圖如下:

hist(data, bins=arange(data.min(), data.max(), 1000), normed=1, cumulative=False) 
plt.ylabel("PDF") 

enter image description here

和聚焦後,它看起來像這樣:

hist(data, bins=arange(0, 121, 1), normed=1, cumulative=False) 
plt.ylabel("PDF") 

enter image description here

注意,最後一個塊被拉伸和最糟糕的是Y刻度被縮放以使得總和恰好爲1(因此根本不考慮當前範圍內的點)

我知道我可以通過在整個可能的範圍內繪製直方圖來實現我想要的,然後將軸限制在我感興趣的部分,但是它浪費了很多時間計算箱,我不會無論如何使用/看。

hist(btsd-40, bins=arange(btsd.min(), btsd.max(), 1), normed=1, cumulative=False) 
axis([0,120,0,0.0025]) 

enter image description here

有畫只關注區域中,但仍然得到Y比例正確的便捷方法嗎?

+0

怎麼會不考慮整個數據集的考慮來計算賦範值?一般情況下,應計算直方圖值,使曲線積分爲1,而不是簡單地除以點數。 – chthonicdaemon

+0

在沒有描述分佈的函數的情況下,你可以做的最好的事情就是計算點數並相應地進行分割。 – cdecker

回答

5

爲了繪製直方圖的一個子集,我不認爲你可以繞過去計算整個直方圖。

您是否試過用numpy.histogram計算直方圖,然後使用pylab.plot或其他什麼來繪製區域?即

import numpy as np 
import pylab as plt 

data = np.random.normal(size=10000)*10000 

plt.figure(0) 
plt.hist(data, bins=np.arange(data.min(), data.max(), 1000)) 

plt.figure(1) 
hist1 = np.histogram(data, bins=np.arange(data.min(), data.max(), 1000)) 
plt.bar(hist1[1][:-1], hist1[0], width=1000) 

plt.figure(2) 
hist2 = np.histogram(data, bins=np.arange(data.min(), data.max(), 200)) 
mask = (hist2[1][:-1] < 20000) * (hist2[1][:-1] > 0) 
plt.bar(hist2[1][mask], hist2[0][mask], width=200) 

原始直方圖: Original histogram

直方圖手動計算: Histogram calculated manually

直方圖人工計算,裁剪: Histogram calculated manually, cropped (NB:值較小,因爲箱是窄)

4

我認爲,你可以使用給定的權重來標準化你的數據。 (repeat是一個numpy函數)。

hist(data, bins=arange(0, 121, 1), weights=repeat(1.0/len(data), len(data)))