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

我有一个大的多索引数据框,我想使用 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 循环中执行此操作。任何人都可以帮忙吗?谢谢。


慕运维8079593
浏览 149回答 2
2回答

守候你守候我

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()输出:

收到一只叮咚

考虑循环第一个索引letter,调用将第二个索引color.loc渲染为循环数据帧的唯一索引,然后迭代调用 :pandas.DataFrame.plotfig, 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()
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python