为了账号安全,请及时绑定邮箱和手机立即绑定

使用 for 循环的多个水平堆积条形图

使用 for 循环的多个水平堆积条形图

慕运维8079593 2022-04-27 13:22:46
我有一个大的多索引数据框,我想使用 for 循环构建多个水平堆叠条形图,但我做错了。arrays = [['A', 'A', 'A','B', 'B', 'C', 'C'], ['red', 'blue', 'blue','purple', 'red', 'black', 'white']]df=pd.DataFrame(np.random.rand(7,4),index=pd.MultiIndex.from_arrays(arrays, names=('letter', 'color')),columns=["anna", "bill","david","diana"])我试过了:fig, axs = plt.subplots(nrows=1, ncols=3, figsize=(10,10))for ax, letter in zip(axs, ["A","B","C"]):    ax.set_title(letter)for name in ["anna","bill","david","diana"]:    ax.barh(df.loc[letter][name], width=0.3)但这不是我想要的。我希望得到的是:对于每个字母,都有一个水平堆积条形图在每个图表中,颜色列在 y 轴上值将按名称堆叠(因此名称是图例标签)由于我的数据框很大,我希望在 for 循环中执行此操作。任何人都可以帮忙吗?谢谢。
查看完整描述

2 回答

?
守候你守候我

TA贡献1802条经验 获得超10个赞

IIUC,尝试以下方法:


grp = df.groupby(level=0)

fig, ax = plt.subplots(1, grp.ngroups, figsize=(10,10))

iax = iter(ax)


for n, g in grp:

    g.plot.barh(ax = next(iax), stacked = True, title = f'{n}')


plt.tight_layout()

输出:

//img1.sycdn.imooc.com//6268d34400013fed07100710.jpg

查看完整回答
反对 回复 2022-04-27
?
收到一只叮咚

TA贡献1821条经验 获得超4个赞

考虑循环第一个索引letter,调用将第二个索引color.loc渲染为循环数据帧的唯一索引,然后迭代调用 :pandas.DataFrame.plot


fig, axs = plt.subplots(nrows=1, ncols=3, figsize=(10,10))


for ax, letter in zip(axs, ["A","B","C"]):

   df.loc[letter].plot(kind='barh', ax=ax, title=letter)

   ax.legend(loc='upper right')


plt.tight_layout()

plt.show()

plt.clf()

plt.close()

//img1.sycdn.imooc.com//6268d35100016dd411970393.jpg

查看完整回答
反对 回复 2022-04-27
  • 2 回答
  • 0 关注
  • 147 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信