Python 绘制分组堆叠条形图实战与参数详解

向北走
向北走
发布时间:2026-10-12| 2人浏览过
原创

本文详细说明如何使用 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)
Excel原始数据预览表,包含类别列与多行财务指标数值
载入后的 DataFrame 结构与原始表格对应,确认各字段名称无误后再进行切片提取

提取所需指标时,需剔除表头索引并转为列表格式,便于后续传入绘图函数。注意修正原稿中的中文引号异常:

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()
由Python生成的双组堆叠条形统计图,清晰展示月度收入与支出的分项构成
最终渲染结果:左侧为收入结构堆叠,右侧为支出结构堆叠,图例位于图表右上方,X轴标签按顺序排列

常见问题与注意事项

  • 刻度对不齐:若发现标签未对准柱体中心,请检查 plt.xticks() 中的偏移值是否准确等于 bar_width / 2。
  • 属性覆盖警告:Matplotlib 不允许对同一坐标轴连续调用 xlabel(),实际操作时请保持单一标签调用,否则后者会覆盖前者。
  • 数据对齐风险:使用 iloc[row, col] 切片时必须确认 Excel 行列索引与实际业务含义一致,建议先行打印预览或使用 head() 验证,防止错位堆叠。

总结

掌握 bottom 堆叠偏移与 x+offset 并列位移的组合用法,即可灵活扩展至任意维度的分组堆叠图形。以上就是 Python 绘制分组堆叠条形图的详细内容,更多关于 Python 数据可视化与报表定制的资料请关注本站其它相关文章!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。