如何使用matplotlib绘制几个核密度估计值?

时间:2017-10-09 13:03:38

标签: python matplotlib

我想绘制几个"填充" matplotlib中的核密度估计(KDE),如垂直violinplot的上半部分或Joy Division未知乐趣的封面艺术的非重叠版本。

理想情况下,我希望matplotlib自己创建密度估计值,这样我就不必自己使用scipy's gaussian kde

2 个答案:

答案 0 :(得分:1)

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并确保首先绘制底层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)

joy division plot

答案 1 :(得分:1)

请注意,有一个名为joypy的现有软件包,它建立在matplotlib之上,可以轻松生成这样的&#34; Joyplots&#34;来自数据框架。

除此之外,没有理由不使用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