簡體   English   中英

如何使用matplotlib繪制幾個內核密度估計值?

[英]How to plot several kernel density estimates using matplotlib?

我想在matplotlib中繪制幾個“填充的”內核密度估計(KDE),例如垂直violinplot的上半部分或Joy Division的Unknown Pleasures封面藝術的非重疊版本。

理想情況下,我希望matplotlib自己創建密度估計,這樣我就不必自己使用scipy的高斯kde了

該答案顯示了如何修改Matplotlib的小提琴圖 這些小提琴圖也可以調整為僅顯示小提琴圖的上半部分。

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圖

通過將物體的透明度設置為0,添加邊緣顏色並確保首先繪制基礎KDE,可以輕松創建外觀漂亮的重疊變體:

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)

喜悅分裂圖

請注意,在matplotlib之上有一個名為joypy的現有軟件包,可以輕松地從數據幀中生成此類“ Joyplots”。

此外,沒有理由不使用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()

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM