Pandas堆积了带有排序值的条形图

时间:2016-11-22 15:34:31

标签: python pandas dataframe bar-chart stacked

我的目标是创建多级数据框的堆积条形图。数据框如下所示:

import pandas as pd
import numpy as np

arrays = [np.array(['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux', 'qux']),
          np.array(['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two', 'three'])]

s = pd.Series([10,20,10,22,10,24,10,26, 11], index=arrays)

In[1]: s

Out[1]: 
bar  one      10
     two      20
baz  one      10
     two      22
foo  one      10
     two      24
qux  one      10
     two      26
     three    11
dtype: int64

我有两个目标:

  1. 创建一个堆积条形图,以便将值堆叠到4个单个容器中,称为" bar,baz,foo,qux"。

  2. 4个条形应按尺寸排序。在这个例子中,qux条将具有高度(10 + 26 + 11 =)47并且应该是第一个左边,然后是foo条,其大小(10 + 24)= 34。

2 个答案:

答案 0 :(得分:6)

  1. 根据总和索引对第一级索引进行排序:
  2. s_sort = s.groupby(level=[0]).sum().sort_values(ascending=False)
    s_sort
    qux    47
    foo    34
    baz    32
    bar    30
    dtype: int64
    
    1. 使用第一级+ unstack +图表中的新排序索引值重新索引:
    2. cmp = plt.cm.get_cmap('jet')
      s.reindex(index=s_sort.index, level=0).unstack().plot.bar(stacked=True, cmap=cmp)
      

      enter image description here

答案 1 :(得分:0)

游戏的一个小附加功能:我们也可以按值在内部索引级别进行排序

s1=s.groupby(level=[0]).apply(lambda x:x.groupby(level=[1]).sum().sort_values(ascending=False))
s1

现在内部级别已排序。

bar  two      20
     one      10
baz  two      22
     one      10
foo  two      24
     one      10
qux  two      26
     three    11
     one      10
dtype: int64

现在,我们以已经提到的方式对外部层次进行排序。

s_sort = s1.groupby(level=[0]).sum().sort_values(ascending=False)
s2 = s1.reindex(index=s_sort.index, level=0)
s2

qux  two      26
     three    11
     one      10
foo  two      24
     one      10
baz  two      22
     one      10
bar  two      20
     one      10
dtype: int64

不幸的是,matplotlib通过在其自己的X(

s2.unstack().plot.bar(stacked=True)

Stacked Bar Chart