Seaborn中displot加hue参数如何通过twinx实现双Y轴展示不平衡类别分布
Seaborn单图双Y轴展示不平衡类别分布的实现方案
sns.displot为Figure级绘图接口,默认创建独立FacetGrid画布,无法直接适配twinx生成的次级轴,要实现单图双Y轴的两类分布展示,可替换为axes级的sns.histplot实现,代码可直接兼容你之前的所有样式、参数配置,完整可运行示例如下(基于泰坦尼克数据集复现):
import seaborn as sns import matplotlib.pyplot as plt # 加载示例数据集,替换为你自己的df即可 df = sns.load_dataset('titanic') # 对应你的字段:x='fare'对应你的Score,hue字段'survived'对应你的Target sns.set_theme() palette = sns.color_palette('rocket', 3) # 创建画布和主Y轴(对应占比高的类别:未生还/Target=0) fig, ax1 = plt.subplots(figsize=(5*1.6, 5)) # 匹配你之前设置的height=5、aspect=1.6的尺寸 # 画类别0的分布 sns.histplot( df[df['survived'] == 0], x='fare', bins=30, linewidth=0, kde=True, color=palette[0], ax=ax1, label='未生还(Target=0)' ) ax1.set_ylabel('未生还样本数量', color=palette[0]) ax1.tick_params(axis='y', labelcolor=palette[0]) # 创建次级Y轴(对应占比低的类别:生还/Target=1) ax2 = ax1.twinx() # 画类别1的分布 sns.histplot( df[df['survived'] == 1], x='fare', bins=30, linewidth=0, kde=True, color=palette[2], ax=ax2, label='生还(Target=1)' ) ax2.set_ylabel('生还样本数量', color=palette[2]) ax2.tick_params(axis='y', labelcolor=palette[2]) # 按需调整类别1的Y轴量程 ax2.set_ylim(0, 150) # 合并两个轴的图例 lines1, labels1 = ax1.get_legend_handles_labels() lines2, labels2 = ax2.get_legend_handles_labels() ax1.legend(lines1 + lines2, labels1 + labels2, loc='upper right') # 设置X轴标签 ax1.set_xlabel('票价(Score)') plt.show()
注意事项
- 两类分布使用相同的bins参数,保证X轴分布完全对齐
- 两个Y轴的标签、刻度颜色匹配对应类别的配色,辨识度更高
- 可按需调整
ax2.set_ylim的参数,适配类别1的样本数量范围 - 若要替换为你自己的数据集,仅需做字段映射替换:
x='fare'改为x='Score',筛选条件的survived字段改为Target即可。
内容的提问来源于stack exchange,提问作者Napoleón Cortés
相关产品推荐
相关产品推荐

