2017-10-09 2 views
0

私はmatiplotlibに "filled"されたカーネル密度推定値(KDE)をプロットしたいと思っています。これは、垂直の上半分のようにviolinplotやJoy DivisionのUnknown Pleasuresのカバーアートのオーバーラップしないバージョンです。matplotlibを使っていくつかのカーネル密度の見積もりをプロットするには?

理想的には、私はscipy's gaussian kde自分自身を使用する必要がないように、matplotlibに密度推定値を作成したいと考えています。

答えて

0

This answerは、Matplotlib's violinplotsの変更方法を示しています。 これらのバイオリンプロットは、バイオリンプロットの上半分のみを表示するように調整することもできます。

pos = np.arange(1, 6)/2.0 
data = [np.random.normal(0, std, size=1000) for std in pos] 

violins = plt.violinplot(data, positions=pos, showextrema=False, vert=False) 

for body in violins['bodies']: 
    paths = body.get_paths()[0] 
    mean = np.mean(paths.vertices[:, 1]) 
    paths.vertices[:, 1][paths.vertices[:, 1] <= mean] = mean 

kde plot

見栄えの良いオーバーラップバリアントを簡単に、0に遺体透明度を設定するにEdgeColorを追加し、最初の基礎となるKDEsをプロットすることを確認することによって作成することができます。

pos = np.arange(1, 6)/2 
data = [np.random.normal(0, std, size=1000) for std in pos] 

violins = plt.violinplot(
    data[::-1], 
    positions=pos[::-1]/5, 
    showextrema=False, 
    vert=False, 

) 

for body in violins['bodies']: 
    paths = body.get_paths()[0] 
    mean = np.mean(paths.vertices[:, 1]) 
    paths.vertices[:, 1][paths.vertices[:, 1] <= mean] = mean   
    body.set_edgecolor('black') 
    body.set_alpha(1) 

joy division plot

1

joypyと呼ばれる既存のパッケージがあり、matplotlibの上にビルドされていますそのような「ジョイプロット」をデータフレームから簡単に作成することができます。

さらに、scipy.stats.gaussian_kdeはKDEを直接提供しているため、使用しない理由はほとんどありません。 violinplotも内部的に使用します。

そこで質問のプロットは

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

pos = np.arange(1, 6)/2.0 
data = [np.random.normal(0, std, size=1000) for std in pos] 

def plot_kde(data, y0, height, ax=None, color="C0"): 
    if not ax: ax = plt.gca() 
    x = np.linspace(data.min(), data.max()) 
    y = gaussian_kde(data)(x) 
    ax.plot(x,y0+y/y.max()*height, color=color) 
    ax.fill_between(x, y0+y/y.max()*height,y0, color=color, alpha=0.5) 

for i, d in enumerate(data): 
    plot_kde(d, i, 0.8, ax=None) 

plt.show() 

enter image description here

のようになります。
関連する問題