如何在Matplotlib条形图中反转堆叠数据的显示顺序?
反转Matplotlib堆叠条形图顺序并调整数值标签位置
要实现堆叠顺序反转(从下到上为Visited game、Applications、Registrations、Website visits),核心是反转DataFrame的列顺序,同时适配调整数值标签的位置逻辑,以下是完整的实现方案:
核心步骤与代码示例
1. 准备数据与反转列顺序
Matplotlib绘制堆叠条形图时,会按照DataFrame的列顺序从下到上堆叠,因此直接反转列的索引即可改变堆叠顺序:
import pandas as pd import matplotlib.pyplot as plt # 示例数据(替换为你的真实数据) funnel_data = { 'Website visits': [1000], 'Registrations': [750], 'Applications': [400], 'Visited game': [200] } df = pd.DataFrame(funnel_data) # 反转列顺序,指定目标堆叠的从下到上顺序 reversed_df = df[['Visited game', 'Applications', 'Registrations', 'Website visits']]
2. 绘制反转后的堆叠条形图并添加数值标签
使用Pandas的plot.bar(stacked=True)直接生成堆叠图,然后遍历每个条形补丁(patch)计算标签位置,确保标签落在对应条形的中心:
# 绘制堆叠条形图 ax = reversed_df.plot(kind='bar', stacked=True, figsize=(8, 6), color=['#ff6b6b', '#4ecdc4', '#45b7d1', '#96ceb4']) # 添加数值标签到每个条形中心 for patch in ax.patches: height = patch.get_height() if height == 0: # 跳过高度为0的条形(避免空标签) continue # 计算标签的坐标:x为条形中心,y为条形底部+高度的一半 x_pos = patch.get_x() + patch.get_width() / 2 y_pos = patch.get_y() + height / 2 # 添加标签文本 ax.text(x_pos, y_pos, f'{int(height)}', ha='center', va='center', fontweight='bold', fontsize=10) # 调整图表样式 ax.set_title('用户转化漏斗(反转堆叠顺序)', fontsize=14) ax.set_xlabel('转化阶段', fontsize=12) ax.set_ylabel('用户数量', fontsize=12) # 调整图例位置,避免遮挡图表 ax.legend(title='转化阶段', bbox_to_anchor=(1.02, 1), loc='upper left') plt.tight_layout() plt.show()
关键细节说明
- 堆叠顺序反转原理:Pandas的
plot.bar(stacked=True)会按列的先后顺序堆叠,第一个列对应最底层条形,最后一个列对应最上层条形,因此反转列索引直接改变堆叠顺序。 - 标签位置适配:通过
patch.get_y()获取当前条形的底部基准位置,加上高度的一半确保标签落在条形中心,不管堆叠顺序如何,这个逻辑都能准确匹配每个条形的位置。 - 多行数据兼容:如果你的数据包含多个类别(比如多组漏斗对比),只需保持列顺序反转即可,标签逻辑无需修改。
内容的提问来源于stack exchange,提问作者Joker221
相关产品推荐
相关产品推荐

