基于泰坦尼克数据,如何在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
相关产品推荐
相关产品推荐

