我与我的(可怜的)熊猫知识斗争,因为我试图通过一个小组的操作获得一个关于层次索引的条形图。
我的数据看起来像这样
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(...)
实验结果应该看起来像这个
我想我只是缺乏对pandas
,matplotlib
,... - 内部的了解,并且绘制几百个项目(cat2< 10,cat1 = 30)并不困难
答案 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()