【问题标题】:Bar chart with separate bars for positive and negative values带有用于正值和负值的单独条形的条形图
【发布时间】:2021-06-27 03:16:36
【问题描述】:

我有一个包含正值和负值的数据框。我想展示一个条形图,它显示两个条形图,一个条形图显示正值的百分比,另一个显示负值的百分比。

dummy = pd.DataFrame({'A' : [-4, -3, -1, 0, 1, 2, 3, 4, 5], 'B' : [-4, -3, -1, 0, 1, 2, 3, 4, 5]})
less_than_0 = dummy['A'][dummy['A'] < 0]
greater_than_0 = dummy['A'][dummy['A'] >= 0]

我能够拆分正值和负值。我用 seaborn 试过这个。

sns.barplot(dummy['A'])

但正面和负面都出现在单个条形图中。 我也试过了

sns.barplot(less_than_0)
sns.barplot(greater_than_0)

有什么方法可以显示 2 个条形图,1 个代表正值的百分比,另一个代表负值的百分比?

【问题讨论】:

    标签: python pandas seaborn bar-chart


    【解决方案1】:

    这不是最优雅的解决方案,但您可以创建一个包含两列的新 DataFrame:labels 包含要在条形图的 x 轴上显示的标签,percentages 包含负值和正值的百分比。

    然后您可以将这些列名和相关信息作为xy 参数传递给sns.barplot

    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    import seaborn as sns
    
    dummy = pd.DataFrame({'A' : [-4, -3, -1, 0, 1, 2, 3, 4, 5], 'B' : [-4, -3, -1, 0, 1, 2, 3, 4, 5]})
    
    df_percentages = pd.DataFrame({
        'labels':['Less than 0', 'Greater than or equal to 0'],
        'percentage':[100*x/len(dummy['A']) for x in [sum(dummy['A'] < 0), sum(dummy['A']>=0)]]
        })
    
    sns.barplot(x='labels', y='percentage', data=df_percentages)
    plt.show()
    

    【讨论】:

      【解决方案2】:

      您可以将Series.value_countsnormalize=True 一起使用,然后绘制Series

      d = {True:'Less than 0',False:'Greater than or equal to 0'}
      s = (dummy['A'] < 0).value_counts(normalize=True).rename(d)
      print (s)
      Greater than or equal to 0    0.666667
      Less than 0                   0.333333
      Name: A, dtype: float64
      
      sns.barplot(x=s.index, y=s.to_numpy())
      

      【讨论】:

        【解决方案3】:

        您可以groupby(dummy.A &gt;= 0)创建正/负分组,然后将每个分组的size()除以A.size转换为比率:

        ax = dummy.groupby(dummy.A >= 0).size().div(dummy.A.size).plot.bar()
        ax.set_xticklabels(['< 0', '>= 0'], rotation=0)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-11-04
          • 1970-01-01
          • 2012-11-23
          • 2014-10-22
          • 2015-05-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多