2014-09-29 3 views
1

Я борюсь с моим (бедным) знанием Панд, поскольку я пытаюсь получить график штриховки по иерархическому индексу группой по операции.Pandas plot subplots of 'group by' result

Мои данные выглядят как этот

id, val, cat1, cat2 

Затем создать иерархические индекс:

df_group = df_len.groupby(['cat1','cat2']) 

Я хотел бы получить HBAR участок для каждого объекта cat1, в котором перечислены все cat2 объекты, которые перечислены значения всех объектов cat1 внутри.

Ни один из моих подходов не работал:

  • df_group.plot(...)
  • for name, group in df_group: .... group.plot(...)
  • df_group.xs(...) эксперименты

Результат должен выглядеть примерно как этот enter image description here

Я предполагаю, что я просто не хватает знаний pandas, matplotlib, ... -internals и это не так уж трудно построить несколько 100 элементов (cat2 < 10, Cat1 = 30)

.

ответ

2

Я бы рекомендовал использовать seaborn, чтобы сделать этот тип граненых участков. Выполнение этого в matplotlib очень сложно, так как библиотека довольно низкого уровня. В этом случае используется Seaborn.

+0

Я пробовал морскую прогулку, но мне не повезло. Но, похоже, это хороший фрагмент кода для более точных данных :) – MaM

1

Не так сложно в matplotlib, см:

In [54]: 

print df 
    cat1 cat2  val 
0 A  1 0.011887 
1 A  2 0.880121 
2 A  3 0.034244 
3 A  4 0.530230 
4 B  1 0.510812 
5 B  2 0.405322 
6 B  3 0.406259 
7 B  4 0.406405 
In [55]: 

col_list = ['r', 'g'] 
ax = plt.subplot(111) 
for (idx, (grp, val)) in enumerate(df.groupby('cat1')): 
    ax.bar(val.cat2+0.25*idx-0.25, 
      val.val, width=0.25, 
      color=col_list[idx], 
      label=grp) 
plt.legend() 

enter image description here

+0

Хорошая идея, но я решил это, наконец, с чистыми пандами и избегал трюков matplot. Но в любом случае, спасибо за вашу помощь! – MaM

2

Ok ребята, так вот как я ее решил окончательно:

dfc = df_len.groupby(['cat1','cat2']).count().reset_index() 
dfp=dfc.pivot(index="cat1",columns="cat2") 
dfp.columns = dfp.columns.get_level_values(1) 
dfp.plot(kind='bar', figsize=(15, 5), stacked=True); 

Короче: я использовал стержень таблицу, чтобы транспонировать мою матрицу, а затем я смог автоматически построить одиночные столбцы в example 2 here.