如何分组堆叠条形图,让同组的多个堆叠条共用同一个标签?
实现方案
思路是将绘图的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
相关产品推荐
相关产品推荐

