如何在Matplotlib中调整堆叠条形图层级:将最大组置于底层
实现堆叠条形图按占比排序(最大组置于底层)
核心逻辑是按各组的总占比从大到小排序,按此顺序依次绘制条形图——Matplotlib中先绘制的条形会处于堆叠的最底层,后绘制的会叠加在上方。
以下是具体实现代码:
import matplotlib.pyplot as plt import numpy as np # 示例数据:替换成你的实际数据 categories = ['类别1', '类别2', '类别3', '类别4'] group_names = ['橙色组', '蓝色组', '绿色组', '紫色组'] # 每组在各分类下的数值(行对应组,列对应分类) group_values = np.array([ [28, 32, 25, 30], # 橙色组(假设为当前占比最大的组) [16, 22, 14, 20], [12, 15, 9, 16], [9, 11, 7, 13] ]) # 计算每组的总数值,用于排序 group_totals = group_values.sum(axis=1) # 获取按总数值降序排列的组索引 sorted_indices = np.argsort(group_totals)[::-1] # 按排序结果重新整理组名和数值 sorted_groups = [group_names[i] for i in sorted_indices] sorted_values = group_values[sorted_indices] # 绘制堆叠条形图 plt.figure(figsize=(10, 6)) bottom_pos = np.zeros(len(categories)) # 初始底部位置为0 for group_name, values in zip(sorted_groups, sorted_values): plt.bar(categories, values, bottom=bottom_pos, label=group_name) bottom_pos += values # 更新底部位置,实现堆叠 plt.title('按占比排序的堆叠条形图') plt.xlabel('分类') plt.ylabel('数值') plt.legend() plt.show()
关键说明
np.argsort(group_totals)[::-1]:先得到各组总数值从小到大的索引,反转后转为降序,确保占比最大的组(橙色组)排在首位,最先被绘制。bottom参数:控制每组条形的起始位置,初始为0,每绘制完一组就将底部位置累加当前组的数值,后续组会叠加在之前所有组的上方。
内容的提问来源于stack exchange,提问作者totnan
相关产品推荐
相关产品推荐

