1. ホーム
  2. python

[解決済み] matplotlib で密度プロットを作成するには?

2022-03-06 01:53:13

質問

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))

<イグ

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()

<イグ

また normed=True パラメータ が、ヒストグラムにガウシアンを当てはめようとする以外には、何も得られなかったのです。

私が最近試したのは、以下のあたりです。 scipy.statsgaussian_kde のように、Web上の例を参考にしましたが、今のところうまくいきません。

どのように解決するのですか?

Sven は、クラス gaussian_kde Scipyから生成されたものですが、Rで生成されたものとは全く違うことに気がつくでしょう。 gaussian_kde は、帯域幅を自動的に推論しようとします。この帯域幅は、関数 covariance_factorgaussian_kde クラスがあります。まず、その関数を変更せずに得られるものは以下の通りです。

しかし、次のようなコードにすると

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()

私は

というのは、Rから得られるものにかなり近いと思います。 gaussian_kde は変更可能な関数を使用しています。 covariance_factor を使用して帯域幅を計算しています。関数を変更する前、このデータに対してcovariance_factorが返した値は約0.5であった。これを下げると帯域幅が狭くなりました。私は _compute_covariance この関数を変更した後、すべてのファクターが正しく計算されるようにしました。Rのbwパラメータと正確に対応しているわけではありませんが、正しい方向に向かうための助けになれば幸いです。