【问题标题】:Plot multiple bar plots with three groups while dividing two columns绘制具有三组的多个条形图,同时划分两列
【发布时间】:2021-06-08 20:46:43
【问题描述】:

我有这个虚拟 df:

data = {'numerator_en':[11, 113, 53],
             'denominator_en':[91, 982, 298],
             'numerator_fr':[6, 232, 58],
             'denominator_fr':[63, 1278, 389],
             'numerator_th':[14, 652, 231],
             'denominator_th':[416, 3835, 1437],
             }

dummy_df = pd.DataFrame(data, index = ['numeric', 'text', 'both'])

看起来像这样:

目标是创建这样一个情节:

请注意,英语、法语和泰语应该只是有不同的颜色 - 没有像图片中那样花哨。

在此,所有语言的 y 轴等于 numerator_xx / denominator_xx,分为数字、文本和两者。
例如,数字将是行数字:numerator_en/denominator_en 和 numerator_fr/denominator_fr 等等......

英语 = _en 法语 = _fr 泰语 = _th

【问题讨论】:

    标签: python pandas dataframe matplotlib


    【解决方案1】:

    尝试使用str.split 创建一个MultiIndex,然后将numerator 除以denominator

    dummy_df.columns = dummy_df.columns.str.split('_', expand=True)
    dummy_df = dummy_df['numerator'] / dummy_df['denominator']
    

    dummy_df:

                   en        fr        th
    both     0.177852  0.149100  0.160752
    numeric  0.120879  0.095238  0.033654
    text     0.115071  0.181534  0.170013
    

    然后plot照常:

    dummy_df.plot(kind='bar', rot=0)
    plt.show()
    


    完整的工作示例:

    import pandas as pd
    from matplotlib import pyplot as plt
    
    data = {'numerator_en': [11, 113, 53],
            'denominator_en': [91, 982, 298],
            'numerator_fr': [6, 232, 58],
            'denominator_fr': [63, 1278, 389],
            'numerator_th': [14, 652, 231],
            'denominator_th': [416, 3835, 1437]}
    
    dummy_df = pd.DataFrame(data, index=['numeric', 'text', 'both'])
    
    dummy_df.columns = dummy_df.columns.str.split('_', expand=True)
    dummy_df = dummy_df['numerator'] / dummy_df['denominator']
    
    dummy_df.plot(kind='bar', rot=0)
    plt.show()
    

    【讨论】:

      【解决方案2】:

      您可以使用 groupby 和 axis=1 来创建基于 en/fr/th 的组。 然后您可以评估每个组的numerator/denominator。 最后,您可以使用.plot(kind ='bar') 绘制条形图。

      (
          df.groupby(df.columns.map(lambda x: x.split('_')[1]), axis=1)
          .apply(lambda x: x.iloc[:, 0].div(x.iloc[:, 1]))
          .plot(kind='bar')
      )
      

      输出:

      【讨论】:

        猜你喜欢
        • 2022-01-09
        • 2014-10-28
        • 1970-01-01
        • 2022-07-07
        • 1970-01-01
        • 2019-08-16
        • 2021-05-07
        • 1970-01-01
        • 2018-08-15
        相关资源
        最近更新 更多