27

これは、この回答に対するフォローアップの質問です。正規化されたヒストグラムをプロットしようとしていますが、y 軸の最大値として 1 を取得する代わりに、異なる数値を取得しています。

配列 k=(1,4,3,1) の場合

 import numpy as np

 def plotGraph():
   
    import matplotlib.pyplot as plt
    
    k=(1,4,3,1)

    plt.hist(k, normed=1)

    from numpy import *
    plt.xticks( arange(10) ) # 10 ticks on x axis

    plt.show()  
    
plotGraph()

このヒストグラムを取得しましたが、これは正規のようには見えません。

ここに画像の説明を入力

別の配列の場合 k=(3,3,3,3)

 import numpy as np

 def plotGraph():
   
    import matplotlib.pyplot as plt
    
    k=(3,3,3,3)

    plt.hist(k, normed=1)

    from numpy import *
    plt.xticks( arange(10) ) # 10 ticks on x axis

    plt.show()  
    
plotGraph()

最大y値が10のこのヒストグラムを取得します。

ここに画像の説明を入力

異なる k の場合、normed=1 または normed=True であっても、y の最大値が異なります。

データに基づいて正規化が (機能する場合) 変更されるのはなぜですか? また、y の最大値を 1 にするにはどうすればよいですか?

アップデート:

私は、バーの高さがmatplotlibで合計1になるヒストグラムをプロットし、非常に奇妙な結果を得ることから、 Carsten Königの回答を実装しようとしています:

import numpy as np

def plotGraph():

    import matplotlib.pyplot as plt

    k=(1,4,3,1)

    weights = np.ones_like(k)/len(k)
    plt.hist(k, weights=weights)

    from numpy import *
    plt.xticks( arange(10) ) # 10 ticks on x axis

    plt.show()  

plotGraph()

結果:

ここに画像の説明を入力

私は何を間違っていますか?

4

5 に答える 5

32

正規化されたヒストグラムをプロットする場合、高さではなく、曲線の下の領域の合計が 1 になる必要があります。

In [44]:

import matplotlib.pyplot as plt
k=(3,3,3,3)
x, bins, p=plt.hist(k, density=True)  # used to be normed=True in older versions
from numpy import *
plt.xticks( arange(10) ) # 10 ticks on x axis
plt.show()  
In [45]:

print bins
[ 2.5  2.6  2.7  2.8  2.9  3.   3.1  3.2  3.3  3.4  3.5]

この例では、ビンの幅は 0.1 で、曲線の下の領域の合計は 1 (0.1*10) になります。

x各ビンの高さを格納します。pこれらの個々の bins オブジェクトのそれぞれを格納します (実際には、それらはです。したがって、各 bin オブジェクトの高さをpatches合計して変更するだけです。x

高さの合計を 1 にするには、 の前に次を追加しますplt.show()

for item in p:
    item.set_height(item.get_height()/sum(x))

ここに画像の説明を入力

于 2014-03-07T04:34:19.850 に答える