You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何分组堆叠条形图,让同组的多个堆叠条共用同一个标签?

实现方案

思路是将绘图的x轴替换为个体列,保证每个个体对应一根独立的条形,再手动计算每个分组的y轴位置区间,仅在每个分组的居中位置展示一次分组标签,即可消除重复的组标签。

完整可运行代码如下:

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

# 固定随机种子方便结果复现
np.random.seed(42)
df = pd.DataFrame(
        {'Group':["A","A","B","B","C","C","C","D"],
         'Individual':["ind1","ind2","ind3","ind4","ind5","ind6","ind7","ind8"],
         'Component1':list(np.random.random(8)),
         'Component2':list(np.random.random(8)),
         'Component3':list(np.random.random(8)),
         'Component4':list(np.random.random(8))
        })

# 绘制堆叠水平条形图,x轴指定为Individual保证每个个体对应一根条形
ax = df.plot(x="Individual", y=["Component1","Component2","Component3","Component4"], 
             kind="barh", stacked=True, legend=None, width=1, xlabel="")

# 计算每个分组对应的y轴位置区间
group_pos = df.reset_index().groupby('Group')['index'].agg(['min', 'max'])
# 计算每个分组标签对应的居中展示位置
group_pos['mid'] = (group_pos['min'] + group_pos['max']) / 2

# 替换y轴刻度,仅保留每个分组的单个标签
ax.set_yticks(group_pos['mid'])
ax.set_yticklabels(group_pos.index)

# 可选:添加分组分隔线,让分组边界更清晰,不需要可删除本段代码
for pos in group_pos['max'][:-1]:
    ax.axhline(pos + 0.5, color='gray', linestyle='--', linewidth=0.8)

plt.tight_layout()
plt.show()

内容的提问来源于stack exchange,提问作者dasilvan9

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 13:45:06