You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于泰坦尼克数据,如何在Seaborn displot性别子图中叠加全体乘客年龄分布?

问题描述

输入图片描述

当前使用以下Seaborn代码绘制了泰坦尼克数据集按性别分栏的乘客年龄KDE分布图:

sns.displot(df,x='Age', col='Sex',kind='kde',multiple="stack")

需求:在每个性别对应的子图中,同时展示全体乘客(男性+女性)的年龄分布数据。

解决方案

方法一:手动叠加全体数据的KDE曲线

先绘制分性别的子图,再遍历每个子图叠加全体数据的分布曲线,通过样式区分两组数据:

import seaborn as sns
import matplotlib.pyplot as plt

# 加载泰坦尼克数据集
df = sns.load_dataset('titanic')

# 生成分性别的KDE分栏图,获取FacetGrid对象
g = sns.displot(df, x='Age', col='Sex', kind='kde', multiple="stack")

# 遍历每个子图,叠加全体乘客的年龄KDE
for ax in g.axes.flat:
    # 用灰色虚线绘制全体数据,添加标签
    sns.kdeplot(df['Age'], ax=ax, color='gray', linestyle='--', label='全体乘客')
    # 显示图例
    ax.legend()

plt.show()

方法二:构造合并数据集,用hue参数区分

通过构造包含全体数据的临时数据集,利用hue参数在子图中同时展示当前性别与全体的分布:

import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd

df = sns.load_dataset('titanic')

# 复制数据并标记分组:一组保留原性别,一组标记为全体
df_sex = df.assign(group=df['Sex'])
df_all = df.assign(group='全体乘客')
combined_df = pd.concat([df_sex, df_all])

# 绘制分栏图,用hue区分分组,设置样式区分
sns.displot(combined_df, x='Age', col='Sex', hue='group', kind='kde', 
            multiple="layer", palette=['#1f77b4', 'gray'], linestyles=['-', '--'])

plt.show()

方法对比

  • 方法一灵活性更高,可单独调整每个子图的叠加样式,适合需要精细自定义的场景
  • 方法二利用Seaborn原生参数实现,代码更简洁,适合快速生成对比可视化

内容的提问来源于stack exchange,提问作者holly

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 22:40:24