Гистограмма с накоплением панд с отсортированными значениями

Моя цель - создать столбчатую диаграмму с накоплением многоуровневого фрейма данных. Фрейм данных выглядит так:

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.


person Pat    schedule 22.11.2016    source источник


Ответы (2)


  1. Сортировка индекса первого уровня по его общей сумме:

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 + график:

cmp = plt.cm.get_cmap('jet')
s.reindex(index=s_sort.index, level=0).unstack().plot.bar(stacked=True, cmap=cmp)

введите описание изображения здесь

person Nickil Maveli    schedule 22.11.2016
comment
Пожалуйста! Да, в этой обстановке цвета действительно выделяются. - person Nickil Maveli; 22.11.2016

Одно небольшое дополнение к игре: мы можем сортировать на уровне внутреннего индекса также по значениям

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)

Гистограмма с накоплением

person Ashish Gulati    schedule 17.10.2018