共享x轴的重叠seaborn图

2024-10-03 11:21:43 发布

您现在位置:Python中文网/ 问答频道 /正文

对不起,如果这太基本了,这是我在论坛上的第一个问题:

我正在使用泰坦尼克号数据集进行练习

我试图画出两个变量“年龄”的分布,一个只与幸存的乘客有关,另一个与死亡的乘客有关。但由于某些原因,它们在一起绘制时不共享相同的x轴

以下是我目前的代码:

df_age = df[df['Age'].notnull()]
dfage_survived = dfage[dfage.Survived == 1] 
dfage_perished = dfage[dfage.Survived == 0] 

sns.set(style="white", palette="muted", color_codes=True)
fig = plt.figure(constrained_layout=True, figsize=(8, 8))
spec = fig.add_gridspec(3, 2)

ax1 = fig.add_subplot(spec[0, 0])
ax1 = sns.barplot(x='Sex', y = 'Survived', data =df)
ax2 = fig.add_subplot(spec[0, 1])
ax2 = sns.barplot(x='Embarked', y = 'Survived', data =df)
ax3 = fig.add_subplot(spec[1, 0])
ax3 = sns.barplot(x='Pclass', y ='Survived', data =df)
ax4 = fig.add_subplot(spec[1, 1])
ax4 = sns.barplot(x='SibSp', y ='Survived', data=df)
ax5 = fig.add_subplot(spec[2, :])
ax5_1 = sns.distplot(dfage_survived['Age'], kde = False, label = 'Survived')
ax5_2 = sns.distplot(dfage_perished['Age'], kde = False, label = 'Perished')
plt.legend(prop={'size': 12})

输出: OUTPUT:


Tags: adddfagedatafigspecsns乘客
2条回答

您必须为每个sns.distplot调用设置存储箱,否则sns将为您设置存储箱,它们基于最小元素和最大元素,并且由于这些对于已消亡和幸存的存储箱是不同的,所以这些存储箱不会对齐。使用bins参数设置适当的存储箱(请参见此处https://seaborn.pydata.org/generated/seaborn.distplot.html

直方图的箱子将最小和最大x之间的范围划分为相等的部分。两个集合具有不同的最小值和最大值。此外,您的数据是离散的,因此箱子边界最好放在整数值之间。可以显式设置存储单元:sns.distplot(…,存储单元=np.arange(-0.5,86,5)),用于这两种类型

然而,一种更简单的方法是利用Seaborn的hue=参数使Seaborn负责分组并一次性创建两个直方图

注意sns.distplot在最新版本(0.11)中已被sns.histplot替换。如果希望两个直方图都堆叠起来,可以添加参数multiple='stack'

为了获得一个独立的示例,下面的代码使用标准的Seaborn Titanic数据集,它使用小写的列名

import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
import seaborn as sns

df = sns.load_dataset('titanic')
sns.set(style="white", palette="muted", color_codes=True)
fig = plt.figure(constrained_layout=True, figsize=(8, 3))
spec = fig.add_gridspec(1, 2)

ax5 = fig.add_subplot(spec[0, :])
sns.histplot(df, x='age', bins=np.arange(-0.5, 86, 5), kde=False, hue='survived', legend=True, ax=ax5)
ax5.legend(['Yes', 'No'], title='Survived?', prop={'size': 12})
plt.show()

example plot

相关问题 更多 >