代码之家  ›  专栏  ›  技术社区  ›  chrisrb10

在Seaborn FacetGrid图上绘制不同“色调”数据的平均线

  •  4
  • chrisrb10  · 技术社区  · 7 年前

    Kaggle )作为Udacity课程的一部分。我使用Seaborn FacetGrid按旅行级别和性别查看乘客年龄分布概况,色调为“存活”(1/0)。

    vertical_mean_line 下面代码中的函数在没有多个“色调”数据的绘图上效果很好,但我找不到为每个色调绘制不同线条的方法

    如果有可能在Seaborn内做到这一点,有什么想法吗?

    当前Seaborn FacetGrid绘图输出:

    Seaborn FacetGrid plot

    sns.set()
    sns.set_context('talk')
    sns.set_style('darkgrid')
    grid = sns.FacetGrid(titanic_data.loc[titanic_data['is_child_def'] == False], col='Sex', row = 'Pclass', hue='Survived' ,size=3.2, aspect=2)
    grid.map(sns.kdeplot, 'Age', shade=True)
    grid.set(xlim=(14, titanic_data['Age'].max()), ylim=(0,0.06))
    grid.add_legend()
    
    
    # Add vertical lines for mean age on each plot
    def vertical_mean_line_survived(x, **kwargs):
        plt.axvline(x.mean(), linestyle = '--', color = 'g')
        #plt.text(x.mean()+1, 0.052, 'mean = '+str('%.2f'%x.mean()), size=12)
        #plt.text(x.mean()+1, 0.0455, 'std = '+str('%.2f'%x.std()), size=12)
    
    grid.map(vertical_mean_line_survived, 'Age') 
    
    # Add text to each plot for relevant popultion size
    # NOTE - don't need to filter on ['Age'].isnull() for children, as 'is_child'=True only possible for children with 'Age' data
    for row in range(grid.axes.shape[0]):
        grid.axes[row, 0].text(60.2, 0.052, 'Survived n = '+str(titanic_data.loc[titanic_data['Pclass']==row+1].loc[titanic_data['is_child_def']==False].loc[titanic_data['Age'].isnull()==False].loc[titanic_data['Survived']==1]['is_male'].sum()), size = 12)
        grid.axes[row, 1].text(60.2, 0.052, 'Survived n = '+str(titanic_data.loc[titanic_data['Pclass']==row+1].loc[titanic_data['is_child_def']==False].loc[titanic_data['Age'].isnull()==False].loc[titanic_data['Survived']==1]['is_female'].sum()), size = 12)
        grid.axes[row, 0].text(60.2, 0.047, 'Perished n = '+str(titanic_data.loc[titanic_data['Pclass']==row+1].loc[titanic_data['is_child_def']==False].loc[titanic_data['Age'].isnull()==False].loc[titanic_data['Survived']==0]['is_male'].sum()), size = 12)
        grid.axes[row, 1].text(60.2, 0.047, 'Perished n = '+str(titanic_data.loc[titanic_data['Pclass']==row+1].loc[titanic_data['is_child_def']==False].loc[titanic_data['Age'].isnull()==False].loc[titanic_data['Survived']==0]['is_female'].sum()), size = 12)
    
    
    
    grid.set_ylabels('Frequency density', size=12)
    
    # Squash down a little and add title to facetgrid    
    plt.subplots_adjust(top=0.9)
    grid.fig.suptitle('Age distribution of adults by Pclass and Sex for Survived vs. Perished')
    
    1 回复  |  直到 7 年前
        1
  •  10
  •   ImportanceOfBeingErnest    7 年前

    这个 kwargs

    def vertical_mean_line_survived(x, **kwargs):
        ls = {"0":"-","1":"--"}
        plt.axvline(x.mean(), linestyle =ls[kwargs.get("label","0")], 
                    color = kwargs.get("color", "g"))
        txkw = dict(size=12, color = kwargs.get("color", "g"), rotation=90)
        tx = "mean: {:.2f}, std: {:.2f}".format(x.mean(),x.std())
        plt.text(x.mean()+1, 0.052, tx, **txkw)
    

    我们会得到

    enter image description here