【问题标题】:Overlayed seaborn distplots sharing x axis共享 x 轴的叠加 seaborn 分布图
【发布时间】:2021-01-19 04:41:16
【问题描述】:

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

我正在使用 Titanic 数据集进行练习和

我正在尝试绘制变量“年龄”的两种分布,一种仅针对幸存的乘客,另一种针对死亡的乘客。但由于某种原因,它们在绘制在一起时并不共享相同的 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:

【问题讨论】:

  • 原因是直方图的 bin 将最小和最大 x 之间的范围分成相等的部分。两组都有不同的最小值和最大值。此外,您的数据是离散的,因此最好将 bin 边界放置在整数值之间。解决方案是明确设置垃圾箱:sns.distplot(..., bins=np.arange(-0.5, 86, 5)) 为两者。

标签: python matplotlib plot seaborn


【解决方案1】:

你必须为每个sns.distplot调用设置bins,否则sns会为你设置bins,它是基于最小元素和最大元素的,因为这些对于perished和survived是不同的,所以bars不会排列向上。使用bins 参数设置合适的分档(见这里https://seaborn.pydata.org/generated/seaborn.distplot.html

【讨论】:

    【解决方案2】:

    直方图的 bin 将最小和最大 x 之间的范围分成相等的部分。两组都有不同的最小值和最大值。此外,您的数据是离散的,因此最好将 bin 边界放置在整数值之间。可以明确设置 bin:sns.distplot(..., bins=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()
    

    【讨论】:

      猜你喜欢
      • 2020-03-06
      • 2019-02-03
      • 2019-09-03
      • 1970-01-01
      • 2021-07-05
      • 2019-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多