web-dev-qa-db-ja.com

matplotlibで密度プロットを作成する方法は?

Rでは、以下を実行することで目的の出力を作成できます。

data = c(rep(1.5, 7), rep(2.5, 2), rep(3.5, 8),
         rep(4.5, 3), rep(5.5, 1), rep(6.5, 8))
plot(density(data, bw=0.5))

Density plot in R

python(matplotlibを使用)で最も近いのは、単純なヒストグラムでした:

import matplotlib.pyplot as plt
data = [1.5]*7 + [2.5]*2 + [3.5]*8 + [4.5]*3 + [5.5]*1 + [6.5]*8
plt.hist(data, bins=6)
plt.show()

Histogram in matplotlib

normed = Trueパラメーター も試しましたが、ヒストグラムにガウスを当てはめようとする以外に何も得られませんでした。

私の最新の試みはscipy.statsgaussian_kdeを中心にしたもので、ウェブ上の例を参考にしましたが、今のところ成功していません。

109
unode

SvenはScipyのクラスgaussian_kdeの使用方法を示しましたが、Rで生成したものとはまったく似ていないことに気付くでしょう。これはgaussian_kdeが帯域幅を自動的に推測しようとするためです。 covariance_factorクラスの関数gaussian_kdeを変更することにより、帯域幅をいろいろな方法で試すことができます。まず、その機能を変更せずに取得できるものを次に示します。

alt text

ただし、次のコードを使用する場合:

import matplotlib.pyplot as plt
import numpy as np
from scipy.stats import gaussian_kde
data = [1.5]*7 + [2.5]*2 + [3.5]*8 + [4.5]*3 + [5.5]*1 + [6.5]*8
density = gaussian_kde(data)
xs = np.linspace(0,8,200)
density.covariance_factor = lambda : .25
density._compute_covariance()
plt.plot(xs,density(xs))
plt.show()

私は得る

alt text

これはあなたがRから得ているものにかなり近いです。私は何をしましたか? gaussian_kdeは、可変機能covariance_factorを使用して帯域幅を計算します。関数を変更する前は、このデータのcovariance_factorによって返された値は約.5でした。これを下げると帯域幅が下がります。すべての要因が正しく計算されるように、その関数を変更した後に_compute_covarianceを呼び出す必要がありました。これは、Rのbwパラメータと正確に対応しているわけではありませんが、うまくいけば正しい方向に進むのに役立ちます。

115
Justin Peel

5年後、私が「Pythonを使用してカーネル密度プロットを作成する方法」をGoogleで調べたとき、このスレッドはまだ上部に表示されています。

今日、これを行うためのはるかに簡単な方法は、 seaborn を使用することです。これは、多くの便利なプロット機能と優れたスタイル管理を提供するパッケージです。

import numpy as np
import seaborn as sns
data = [1.5]*7 + [2.5]*2 + [3.5]*8 + [4.5]*3 + [5.5]*1 + [6.5]*8
sns.set_style('whitegrid')
sns.kdeplot(np.array(data), bw=0.5)

enter image description here

126
Xin

たぶん次のようなものを試してください:

import matplotlib.pyplot as plt
import numpy
from scipy import stats
data = [1.5]*7 + [2.5]*2 + [3.5]*8 + [4.5]*3 + [5.5]*1 + [6.5]*8
density = stats.kde.gaussian_kde(data)
x = numpy.arange(0., 8, .1)
plt.plot(x, density(x))
plt.show()

gaussian_kde()は、異なるカーネル密度推定値に簡単に置き換えることができます。

44
Sven Marnach

オプション1:

pandasデータフレームプロットを使用(matplotlibの上に構築):

import pandas as pd
data = [1.5]*7 + [2.5]*2 + [3.5]*8 + [4.5]*3 + [5.5]*1 + [6.5]*8
pd.DataFrame(data).plot(kind='density') # or pd.Series()

enter image description here

オプション2:

distplotseabornを使用:

import seaborn as sns
data = [1.5]*7 + [2.5]*2 + [3.5]*8 + [4.5]*3 + [5.5]*1 + [6.5]*8
sns.distplot(data, hist=False)

enter image description here

40
Aziz Alto