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
相关产品推荐
相关产品推荐

