熊猫绘制了“分组依据”结果的子图

时间:2014-09-29 15:42:26

标签: python numpy matplotlib pandas

我与我的(可怜的)熊猫知识斗争,因为我试图通过一个小组的操作获得一个关于层次索引的条形图。

我的数据看起来像这样

id, val, cat1, cat2

然后我创建一个分层索引:

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

我希望每个cat1对象获得一个 hbar plot ,列出列出所有cat1对象值的所有cat2对象。

我的方法都不起作用:

  • df_group.plot(...)
  • for name, group in df_group: .... group.plot(...)
  • df_group.xs(...)实验

结果应该看起来像这个 enter image description here

我想我只是缺乏对pandasmatplotlib,... - 内部的了解,并且绘制几百个项目(cat2< 10,cat1 = 30)并不困难

3 个答案:

答案 0 :(得分:2)

我建议使用seaborn来制作此类型的分面图。在matplotlib中执行它非常棘手,因为库的级别很低。 Seaborn擅长这个用例。

答案 1 :(得分:2)

好的伙计们,所以我最终解决了这个问题:

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自动绘制单个cols。

答案 2 :(得分: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