Python 绘制分组堆叠条形图实战与参数详解
本文详细说明如何使用 Python 的 matplotlib 库绘制分组堆叠条形图。通过加载 Excel 数据,结合多次调用 plt.bar() 并配置 bottom 偏移量与柱体间距,实现多组数据的对比展示。附带完整代码、关键参数说明及图表导出方法,解决常规教程仅展示单组堆叠的不足。
实现目标与依赖环境
常规的数据可视化教程多演示单一分类的堆叠效果,但在实际业务报表中,经常需要对比不同类别的多项指标(如分月份的收支结构)。本文以 Python 为基础,使用 pandas 读取表格数据,借助 matplotlib 的绘图接口,实现一组内的多项指标堆叠,并通过水平位移完成多组并列显示。
操作前需确保已安装以下核心库:
numpy:处理数组与数值计算pandas:解析 Excel 表格并提取切片数据matplotlib.pyplot及matplotlib.ticker:负责图形渲染与刻度控制
数据准备与结构读取
假设待分析的数据已整理为 Excel 文件,首列为时间节点或类别标识,后续列对应具体指标行。通过 read_excel() 可直接载入内存:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
data = pd.read_excel('data.xlsx')
print(data)

提取所需指标时,需剔除表头索引并转为列表格式,便于后续传入绘图函数。注意修正原稿中的中文引号异常:
tick_label = list(data.columns)
tick_label.remove('类别') # 移除分类轴标识列
x = np.arange(len(tick_label)) # 生成等差整数序列作为横坐标基准
y1 = data.iloc[2, 1:].values.tolist() # 第一组指标:收入(剔除自己转入)
y2 = data.iloc[3, 1:].values.tolist() # 第二组指标:支出(剔除自己转入)
y3 = data.iloc[4, 1:].values.tolist() # 第三组指标:收入(自己转入)
y4 = data.iloc[5, 1:].values.tolist() # 第四组指标:支出(自己转入)
核心绘图步骤与参数配置
分组堆叠的核心逻辑在于两次控制:垂直方向使用 bottom 参数实现同类目内的上下堆叠;水平方向通过 x + offset 实现不同类目之间的并列排布。具体步骤如下:
第1步:初始化画布与定义宽度
设置图形尺寸并固定柱体宽度,保证多组并列时不会重叠或留白过大。
bar_width = 0.25 # 单根柱体横向宽度
plt.figure(figsize=(12, 6)) # 设定画布分辨率与比例
第2步:绘制第一层基础柱体
先画出基线数据,确定后续堆叠的高度起点。
plt.bar(x, y1, width=bar_width, align='center', color='orangered', alpha=0.6, label='收入(剔除自己转入)')
plt.bar(x, y3, width=bar_width, bottom=y1, align='center', color='lightsalmon', alpha=0.6, label='收入(自己转入)')
注意:bottom=y1 会将第三组柱体的起始位置直接接在第一组柱体的顶端,形成第一列的堆叠效果。
第3步:绘制第二层偏移柱体
在横坐标加上 bar_width 后,重复堆叠逻辑,完成第二列的绘制。
plt.bar(x + bar_width, y2, width=bar_width, align='center', color='deepskyblue', alpha=0.6, label='支出(剔除自己转入)')
plt.bar(x + bar_width, y4, width=bar_width, bottom=y2, align='center', color='lightskyblue', alpha=0.6, label='支出(自己转入)')
第4步:完善坐标轴、图例与导出
调整 X 轴刻度位置使其居中于每组柱体下方,配置全局图例避免遮挡主体区域,最后保存高清 PNG 图像。原稿中存在重复调用 plt.xlabel() 的情况,已合并为标准单次调用以免引发覆盖或警告。
plt.title('月度收支表', fontsize=10)
plt.xticks(x + bar_width / 2, tick_label, rotation=70)
plt.xlabel('时间', fontsize=8, va='top', ha='right')
plt.legend(loc='center', bbox_to_anchor=(0.77, 1.1), ncol=2)
plt.savefig('draw_bar.png', dpi=200, bbox_inches='tight')
plt.close()

常见问题与注意事项
- 刻度对不齐:若发现标签未对准柱体中心,请检查
plt.xticks()中的偏移值是否准确等于bar_width / 2。 - 属性覆盖警告:Matplotlib 不允许对同一坐标轴连续调用
xlabel(),实际操作时请保持单一标签调用,否则后者会覆盖前者。 - 数据对齐风险:使用
iloc[row, col]切片时必须确认 Excel 行列索引与实际业务含义一致,建议先行打印预览或使用head()验证,防止错位堆叠。
总结
掌握 bottom 堆叠偏移与 x+offset 并列位移的组合用法,即可灵活扩展至任意维度的分组堆叠图形。以上就是 Python 绘制分组堆叠条形图的详细内容,更多关于 Python 数据可视化与报表定制的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













