6

matplotlibを使用してヒストグラムの一部を描画しようとしています。

外れ値が多く値が大きいヒストグラム全体を描画するのではなく、ごく一部に焦点を当てたいと思います。元のヒストグラムは次のようになります。

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

ここに画像の説明を入力してください

そして焦点を合わせた後、それは次のようになります:

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

ここに画像の説明を入力してください

最後のビンが引き伸ばされ、すべてのYティックの中で最悪のものがスケーリングされて、合計が正確に1になることに注意してください(したがって、現在の範囲外のポイントはまったく考慮されません)

可能な範囲全体にわたってヒストグラムを描画し、次に軸を関心のある部分に制限することで、目的を達成できることはわかっていますが、使用しない/表示しないビンを計算するのに多くの時間を浪費します。 。

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

ここに画像の説明を入力してください

焦点の合った領域だけを描画しながら、Yスケールを正しく取得するための高速で簡単な方法はありますか?

4

2 に答える 2

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)

元のヒストグラム: 元のヒストグラム

手動で計算されたヒストグラム: 手動で計算されたヒストグラム

ヒストグラムは手動で計算され、トリミングされます:( ヒストグラムは手動で計算され、トリミングされます 注:ビンが狭いため、値は小さくなります)

于 2012-09-05T14:50:24.117 に答える
5

与えられた重みを使用してデータを正規化できると思います。(repeatnumpy関数です)。

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

于 2012-09-05T15:34:36.723 に答える