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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 17:27:03