如何在某个值下对 kdeplot 进行着色

我想将 kdeplot 下的区域遮蔽在值 -1.64 以下。

我在 -1.64 处绘制了 kdeplot 和一条垂直线。如何填充 kdeplot、x 轴和垂直线之间的三角形区域?

另外,我希望橙色垂直线的高度刚好达到 kdeplot。

fig, ax = plt.subplots(nrows=2, ncols=2,figsize=(12,6), tight_layout=True, sharex=True, sharey=True)
sns.kdeplot(pop_norm.fev1_z, ax=ax[0,0], legend=False)
ax[0,0].axvline(x=pop_norm.fev1_z.mean(), linestyle = '--', alpha =0.5)
ax[0,0].axvline(x=-1.64, linestyle = '-', color = palette[1], alpha =0.5)
ax[0,0].set_xlabel("FEV1 z-score")
ax[0,0].set_ylabel("Population density")

sns.kdeplot(pop_norm.fvc_z, ax=ax[0,1], legend=False)
ax[0,1].axvline(x=pop_norm.fvc_z.mean(), linestyle = '--', alpha =0.5)
ax[0,1].axvline(x=-1.64, linestyle = '-', color = palette[1], alpha =0.5)
ax[0,1].set_xlabel("FVC z-score")

sns.kdeplot(pop_norm.fev1fvc_z, ax=ax[1,0], legend=False)
ax[1,0].axvline(x=pop_norm.fev1fvc_z.mean(), linestyle = '--', alpha =0.5)
ax[1,0].axvline(x=-1.64, linestyle = '-', color = palette[1], alpha =0.5)
ax[1,0].set_xlabel("FEV1/FVC z-score")
ax[1,0].set_ylabel("Population density")

sns.kdeplot(pop_norm.fef2575_z, ax=ax[1,1], legend=False)
ax[1,1].axvline(x=pop_norm.fef2575_z.mean(), linestyle = '--', alpha =0.5)
ax[1,1].axvline(x=-1.64, linestyle = '-', color = palette[1], alpha =0.5)
ax[1,1].set_xlabel("FEF 25-75% z-score")

enter image description here

stack overflow How to shade kdeplot under a certain value
原文答案

答案:

作者头像

您可以通过从子图中的最后一个 lines 元素中提取 x 和 y 数据来提取 kde 的曲线。

这些 x 和 y 既可用于在给定 x 值处内插曲线高度,也可用作 fill_between() 的参数。

这是一个带有一个子图的示例:

import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns

pop_norm_fev1_z = np.random.normal(-.004, .01, 500).cumsum()

fig, ax = plt.subplots(figsize=(12, 6))

sns.kdeplot(pop_norm_fev1_z, ax=ax, legend=False)
x = ax.lines[-1].get_xdata()
y = ax.lines[-1].get_ydata()
mean = pop_norm_fev1_z.mean()
ax.vlines(mean, 0, np.interp(mean, x, y), linestyle='--', alpha=0.5)
x_special = -1.64
ax.vlines(x_special, 0, np.interp(x_special, x, y), linestyle='-', color='crimson', alpha=0.5)
ax.fill_between(x, 0, y, where=x < x_special, color='gold', alpha=0.3)
plt.show()

example plot