如何向 Seaborn 分布图添加均值线和中线

a11*_*a11 5 python matplotlib histogram seaborn

有没有办法将平均值和中位数添加到 Seaborn's displot

penguins = sns.load_dataset("penguins")
g = sns.displot(
    data=penguins, x='body_mass_g',
    col='species',  
    facet_kws=dict(sharey=False, sharex=False)
)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

基于向 seaborn FacetGrid distplots 添加均值和可变性,我看到我可以定义一个FacetGrid并映射一个函数。我可以将自定义函数传递给displot吗?

尝试displot直接使用的原因是这些图开箱即用更漂亮,无需调整刻度标签大小、轴标签大小等,并且在视觉上与我制作的其他图保持一致。

def specs(x, **kwargs):
    ax = sns.histplot(x=x)
    ax.axvline(x.mean(), color='k', lw=2)
    ax.axvline(x.median(), color='k', ls='--', lw=2)

g = sns.FacetGrid(data=penguins, col='species')
g.map(specs,'body_mass_g' )
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

Tre*_*ney 12

选项1

  • 使用plt.而不是ax.
    • 在OP中,将vlines用于axhistplot但在这里,该图形是在 之前创建的.map
penguins = sns.load_dataset("penguins")
g = sns.displot(
    data=penguins, x='body_mass_g',
    col='species',  
    facet_kws=dict(sharey=False, sharex=False)
)

def specs(x, **kwargs):
    plt.axvline(x.mean(), c='k', ls='-', lw=2.5)
    plt.axvline(x.median(), c='orange', ls='--', lw=2.5)

g.map(specs,'body_mass_g' )
Run Code Online (Sandbox Code Playgroud)

选项2

  • 此选项更详细,但更灵活,因为它允许访问和添加来自除用于创建displot.
import seaborn as sns
import pandas as pd

# load the data
pen = sns.load_dataset("penguins")

# groupby to get mean and median
pen_g = pen.groupby('species').body_mass_g.agg(['mean', 'median'])

g = sns.displot(
    data=pen, x='body_mass_g',
    col='species',  
    facet_kws=dict(sharey=False, sharex=False)
)
# extract and flatten the axes from the figure
axes = g.axes.flatten()

# iterate through each axes
for ax in axes:
    # extract the species name
    spec = ax.get_title().split(' = ')[1]
    
    # select the data for the species
    data = pen_g.loc[spec, :]
    
    # print data as needed or comment out
    print(data)
    
    # plot the lines
    ax.axvline(x=data['mean'], c='k', ls='-', lw=2.5)
    ax.axvline(x=data['median'], c='orange', ls='--', lw=2.5)
Run Code Online (Sandbox Code Playgroud)

两个选项的输出

在此输入图像描述

资源