如何在 kdeplot 上为每个变量绘制一条平均线

问题描述 投票:0回答:1

我想可视化 kdeplot 上绘制的每个变量的平均值和百分位数

此处提供的代码“kdeplot显示均值和四分位数”确实在图上绘制了均值和百分位数,但我想对具有多个变量的图(例如下面的代码显示的变量)执行此操作。

sns.kdeplot(data=penguins, x="flipper_length_mm", hue="species", multiple="stack");

换句话说,有没有办法获得转换后的 Flipper_length_mm 数据,用于生成 3 个物种中每一个的绘图?

matplotlib seaborn
1个回答
0
投票

要获取创建每条曲线的值,您可以提取物种的行(例如

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()

add mean line to kdeplot separated per hue

© www.soinside.com 2019 - 2024. All rights reserved.