gpt4 book ai didi

python - 在 Matplotlib 中单独排序堆积条形图

转载 作者:行者123 更新时间:2023-11-28 18:56:16 27 4
gpt4 key购买 nike

我正在尝试单独对堆叠条形图的组件进行排序以提高可读性(在 DataFrame 本身中),或者在绘制图表后,我无法确定是否有好的方法来执行此操作。

例如,我有这本关于玩家和与对手对抗的时间的字典 -

so_oppo_dict = {
'Player 1': {'Opponent 1': 2.15, 'Opponent 2': 3.5333, 'Opponent 3': 3.1},
'Player 2': {'Opponent 1': 2.2167, 'Opponent 2': 1.8667, 'Opponent 3': 2.3333},
'Player 3': {'Opponent 1': 1.5333, 'Opponent 2': 4.3833, 'Opponent 3': 4.15}
}

然后我使用以下代码将其绘制成图形,将其变成堆积条形图 -

fig, ax = plt.subplots()
ax = plt.subplot(111)
so_oppo_df.T.plot(kind="barh", stacked=True, ax=ax)
fig.tight_layout()
fig.savefig('opponents-stacked.png')

我的结果图看起来像这样,堆叠条形图的每个组件都按相同顺序排序。我想做的是重新排列条形的组成部分,按最高到最低排序(这样绿色和橙色条就会出现在蓝色条之前)——这可能吗?

enter image description here

最佳答案

基于 this phenomenal answer我能够准确地生产出所需要的东西。这是我在下面完成的代码片段和生成的图像(带有更大的字典)。

x = so_oppo_df.index
indexes = np.argsort(so_oppo_df.values).T
widths = np.sort(so_oppo_df.values).T
order = -1
lefts = widths[::order].cumsum(axis=0)
lefts = np.insert(lefts, 0, np.zeros(len(lefts[0])), axis=0)

mpp_colors = dict(zip(so_oppo_df.columns, plt.cm.get_cmap("tab20c").colors))

for k, (idxs, vals) in enumerate(list(zip(indexes, widths))[::order]):
mps = np.take(np.array(so_oppo_df.columns), idxs)
ax1.barh(x, width=vals, left=lefts[k], color=[mpp_colors[m] for m in mps])

ax1.legend((np.take(np.array(so_oppo_df.columns), np.argsort(so_oppo_df.values)[0]))[::-1], bbox_to_anchor=(1.05, 1), loc='upper left', ncol=1)
ax1.title.set_text(f"Team Opposition - 5v5 Sorted TOI")

Horizontal Bar Chart (Sorted by Individual Values)

关于python - 在 Matplotlib 中单独排序堆积条形图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58360294/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com