2012-09-05 5 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)))