使用 Seaborn 的分布图的部分阴影

Dro*_*ror 4 python data-visualization distribution matplotlib seaborn

以下简单代码:

import numpy as np
import seaborn as sns
dist = np.random.normal(loc=0, scale=1, size=1000)
ax = sns.kdeplot(dist, shade=True);
Run Code Online (Sandbox Code Playgroud)

产生以下图像:

在此处输入图片说明

我只想将所有内容都正确着色(或保留某些 x 值)。最简单的方法是什么?我准备使用 Seaborn 以外的其他东西。

unu*_*tbu 6

调用后ax = sns.kdeplot(dist, shade=True),最后一行ax.get_lines()对应的是kde密度曲线:

ax = sns.kdeplot(dist, shade=True)
line = ax.get_lines()[-1]
Run Code Online (Sandbox Code Playgroud)

您可以使用以下方法提取与该曲线对应的数据line.get_data

x, y = line.get_data()
Run Code Online (Sandbox Code Playgroud)

获得数据后,例如,您可以x > 0通过选择这些点并调用来对对应的区域进行着色ax.fill_between

mask = x > 0
x, y = x[mask], y[mask]
ax.fill_between(x, y1=y, alpha=0.5, facecolor='red')
Run Code Online (Sandbox Code Playgroud)
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
dist = np.random.normal(loc=0, scale=1, size=1000)
ax = sns.kdeplot(dist, shade=True)
line = ax.get_lines()[-1]
x, y = line.get_data()
mask = x > 0
x, y = x[mask], y[mask]
ax.fill_between(x, y1=y, alpha=0.5, facecolor='red')
plt.show()
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明


Imp*_*est 5

对于标准绘图来说,使用seaborn通常没问题,但当一些定制需求发挥作用时,回到matplotlib通常会更容易。

因此,可以首先计算核密度估计,然后将其绘制在感兴趣的区域中。

import scipy.stats as stats
import numpy as np
import matplotlib.pyplot as plt
plt.style.use("seaborn-darkgrid")

dist = np.random.normal(loc=0, scale=1, size=1000)
kde = stats.gaussian_kde(dist)
# plot complete kde curve as line
pos = np.linspace(dist.min(), dist.max(), 101)
plt.plot(pos, kde(pos))
# plot shaded kde only right of x=0.5
shade = np.linspace(0.5,dist.max(), 101)
plt.fill_between(shade,kde(shade), alpha=0.5)

plt.ylim(0,None)
plt.show()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述