web-dev-qa-db-ja.com

Pythonで線ヒストグラムチャートを生成するクリーンな方法はありますか?

ステップや棒グラフではなく、線をプロットするヒストグラムを作成する必要があります。 python= 2.7を使用しています。以下のplt.hist関数は階段状の線をプロットしますが、ビンはplt.plot関数に整列しません。

import matplotlib.pyplot as plt
import numpy as np
noise = np.random.normal(0,1,(1000,1))
(n,x,_) = plt.hist(noise, bins = np.linspace(-3,3,7), histtype=u'step' )  
plt.plot(x[:-1],n)

あたかもhistt​​ype = u'line 'フラグがalign = u'mid'フラグと一致するかのように、ビンの中心での各ビンのカウントと相関する線が必要です

15
DanGoodrick

Scipyを使用すると、次のことができます se stats.gaussian_kde to 確率密度関数を推定

import matplotlib.pyplot as plt
import numpy as np
import scipy.stats as stats

noise = np.random.normal(0, 1, (1000, ))
density = stats.gaussian_kde(noise)
n, x, _ = plt.hist(noise, bins=np.linspace(-3, 3, 50), 
                   histtype=u'step', density=True)  
plt.plot(x, density(x))
plt.show()

enter image description here

16
unutbu

使用しているx値はビンのエッジであるため、作成するラインプロットは整列しません。ビンの中心は次のように計算できます。bin_centers = 0.5*(x[1:]+x[:-1])次に、完全なコードは次のようになります。

_noise = np.random.normal(0,1,(1000,1))
n,x,_ = plt.hist(noise, bins = np.linspace(-3,3,7), histtype=u'step' )
bin_centers = 0.5*(x[1:]+x[:-1])
plt.plot(bin_centers,n) ## using bin_centers rather than edges
plt.show()
_

プロットをy = 0で塗りつぶしたい場合は、plt.fill_between(bin_centers,n)Line histogram at bin centers

3
MattB

Matplotlibのサムネイルギャラリー は、通常、このような状況で非常に役立ちます。ギャラリーからの thisthis one の組み合わせといくつかのカスタマイズは、おそらくあなたが考えているものに非常に近いものです。

import numpy as np
import matplotlib.mlab as mlab
import matplotlib.pyplot as plt

mu = 0
sigma = 1
noise = np.random.normal(mu, sigma, size=1000)
num_bins = 7
n, bins, _ = plt.hist(noise, num_bins, normed=1, histtype='step')
y = mlab.normpdf(bins, mu, sigma)
plt.plot(bins, y, 'r--')
plt.show()

enter image description here

また、ビンの数を増やすと役立ちます...

enter image description here

2
mty