【问题标题】:Seaborn Normalized Bar ChartSeaborn 标准化条形图
【发布时间】:2020-09-08 11:17:09
【问题描述】:

我有一个数据框,其中两列包含 True 和 False,一列包含性别:男性和女性。

我正在尝试计算每个性别的每列的 True 数量,但通过每个性别的数量进行标准化。

到目前为止,我所做的是将我的数据与整个 datafame df_up 进行标准化。但是如何根据每个性别的数量分别对每个进行标准化呢?

percentage = lambda x: sum(x) / len(df_up)
ax6 = sns.barplot(x="value", y="variable", hue="Gender", data=melted_fan, estimator=percentage, ci=None, palette=palette) 

【问题讨论】:

    标签: python pandas bar-chart seaborn


    【解决方案1】:

    我猜这就是你所做的:

    import seaborn as sns
    import numpy as np
    import pandas as pd
    df = pd.DataFrame({'Gender':np.random.choice(["Female","Male"],100),
                      'star_wars_fan':np.random.choice([True,False],100),
                       'star_trek_fan':np.random.choice([True,False],100)
                      })
    
    melted_fan = df.groupby('Gender').agg(sum).reset_index().melt(id_vars="Gender")
    melted_fan
    
        Gender  variable    value
    0   Female  star_wars_fan   29.0
    1   Male    star_wars_fan   16.0
    2   Female  star_trek_fan   26.0
    3   Male    star_trek_fan   29.0
    
    sns.barplot(x="value", y="variable", hue="Gender", 
                      data=melted_fan, ci=None)
    

    不幸的是,在 sns.barplot 中,它被分成了子组,并且估计器是应用于每个组的函数,因此很难使用它。更简单的方法是在绘图前计算百分比:

    melted_fan['perc'] =  melted_fan.groupby('variable')['value'].apply(lambda x:100*x/x.sum())
    sns.barplot(x="value", y="variable", hue="Gender", 
                      data=melted_fan, ci=None)
    

    【讨论】:

      【解决方案2】:

      这种条形图可以通过 pandas 绘图来构建:

      import matplotlib.pyplot as plt
      from matplotlib.ticker import PercentFormatter
      import pandas as pd
      import numpy as np
      
      N = 1000
      df = pd.DataFrame({'Star Wars': np.random.randint(0, 2, N, dtype=np.bool),
                         'Star Trek': np.random.randint(0, 2, N, dtype=np.bool),
                         'Gender': np.random.choice(['Male', 'Female'], N, p=[0.6, 0.4])
                         })
      ax = df.groupby(['Gender'])[['Star Wars', 'Star Trek']].agg('mean').transpose().plot(kind='barh')
      ax.xaxis.set_major_formatter(PercentFormatter(1))
      plt.show()
      

      【讨论】:

        猜你喜欢
        • 2017-07-20
        • 2017-02-26
        • 1970-01-01
        • 1970-01-01
        • 2017-08-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-08
        相关资源
        最近更新 更多