我想可视化 kdeplot 上绘制的每个变量的平均值和百分位数
此处提供的代码“kdeplot显示均值和四分位数”确实在图上绘制了均值和百分位数,但我想对具有多个变量的图(例如下面的代码显示的变量)执行此操作。
sns.kdeplot(data=penguins, x="flipper_length_mm", hue="species", multiple="stack");
换句话说,有没有办法获得转换后的 Flipper_length_mm 数据,用于生成 3 个物种中每一个的绘图?
要获取创建每条曲线的值,您可以提取物种的行(例如
x = penguins[penguins['species'] == 'Adelie']
)。要以正确的顺序获取物种名称,您可以从图例中提取它们的名称(以相反的顺序,因为seaborn首先绘制最后一个)。
由于值可以包含
NaN
,因此 np.nanmean()
计算平均值时会忽略这些值。为了考虑堆叠的 kde 曲线,您可以存储前一条曲线并仅在前一条曲线和当前曲线之间填充。
import matplotlib.pyplot as pt
import seaborn as sns
import numpy as np
penguins = sns.load_dataset('penguins')
ax = sns.kdeplot(data=penguins, x='flipper_length_mm', hue='species', multiple='stack', fill=False)
prev_ys = 0
for kdeline, legend_text in zip(ax.lines, ax.legend_.texts[::-1]):
print(legend_text.get_text())
x = penguins[penguins['species'] == legend_text.get_text()]['flipper_length_mm'].values
mean = np.nanmean(x)
xs = kdeline.get_xdata()
ys = kdeline.get_ydata()
prev_height = 0 if np.isscalar(prev_ys) else np.interp(mean, xs, prev_ys)
height = np.interp(mean, xs, ys)
ax.vlines(mean, prev_height, height, color=kdeline.get_color(), ls=':')
ax.fill_between(xs, prev_ys, ys, facecolor=kdeline.get_color(), alpha=0.2)
prev_ys = ys
plt.show()