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

Seaborn countplot在泰坦尼克号数据集上显示结果异常问题排查

问题原因与解决方案

嘿,我一看你遇到的这个问题就知道咋回事了——这是Seaborn的countplot在FacetGrid里的一个小坑,不是数据错了,是显示顺序搞混了!

为什么会出现这个矛盾?

你用data1['Sex'].value_counts()得到的总人数是对的(男性577,女性314),但绘图时看到的“未存活女性450+”其实是把男性的数量当成女性的了。原因很简单:
当你直接用plot1.map(sns.countplot,'Sex')时,countplot会自动按每个子图内类别的数量从多到少排序x轴:

  • 在「未存活」的子图里,男性死亡人数远多于女性,所以x轴第一个显示的是male(对应柱子高度≈468),第二个才是female(≈81);
  • 在「存活」的子图里,女性存活人数远多于男性,所以x轴第一个显示的是female(≈233),第二个是male(≈109)。

两个子图的x轴顺序不一样,你肯定是把未存活子图里的第一个柱子(男性)当成女性了,才会觉得女性人数远超总人数~

怎么解决?

只需要给countplot加一个order参数,强制两个子图的x轴顺序保持一致就行,比如统一按['male', 'female']排列:

plot1 = sns.FacetGrid(data1, col='Survived')
plot1.map(sns.countplot, 'Sex', order=['male', 'female'])
plt.show()

这样你就能清晰看到:

  • 未存活组:男性柱子很高,女性柱子很矮;
  • 存活组:女性柱子很高,男性柱子较矮。

更直观的替代方案

其实不用FacetGrid,直接用countplot加hue参数,能一次性展示所有对比信息,更不容易看错:

import seaborn as sns
import matplotlib.pyplot as plt

sns.countplot(data=data1, x='Survived', hue='Sex')
# 把x轴标签改成中文更易懂
plt.xticks(ticks=[0, 1], labels=['未存活', '存活'])
plt.legend(title='性别')
plt.show()

这样你一眼就能对比出每个存活类别下的男女人数,完全不会有顺序混淆的问题~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:29:29