[英]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
通過將物體的透明度設置為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.