Python实战:用pandas与matplotlib绘制堆叠柱状图

凌晨两点半
凌晨两点半
发布时间:2026-10-11 | 2人浏览过
原创

本文演示如何使用Python的pandas和matplotlib库,通过读取Excel数据绘制堆叠柱状图,直观展示各店铺的销售数量及其组成部分,适用于日常数据分析与报告制作。

实现目标:清晰呈现多维度销售数据

堆叠柱状图适合展示具有多个子类别的数据总量及内部构成,例如不同店铺的销售额分解为商品A、B两组销量。本文将通过实操代码,从读取Excel到渲染出带标签的图表,全程提供可直接运行的Python脚本。

第1步:导入核心库并配置中文字体

目的:解决matplotlib默认不支持中文显示的问题,避免坐标轴乱码。入口:新建Python脚本。动作:加载pandas处理表格数据,调用matplotlib绘图,设置黑体(SimHei)为全局字体。重要参数:plt.rcParams['font.family'] = ['SimHei']。完成状态:后续文本元素可正常渲染中文。

import pandas as pd
import matplotlib.pyplot as plt

plt.rcParams['font.family'] = ['SimHei']  # 指定中文字体为黑体

第2步:读取Excel数据源

目的:获取包含店铺名称与两类销售量的原始表。入口:使用pandas。read_excel()方法。动作:传入文件路径,指定工作表名。示例路径为本地绝对路径,实际使用时需替换为有效位置。参数:sheet_name='Sheet3'。完成状态:变量df存储DataFrame结构的数据集。

df = pd.read_excel(r'C:\Users\liuchunlin2\Desktop\新建文件夹\新建 XLSX 工作表.xlsx', sheet_name='Sheet3')

第3步:定义绘图尺寸与横轴刻度

目的:控制柱子宽度及x轴标签位置。动作:设置柱宽0.35,以索引作为x轴坐标序列。参数:bar_width = 0.35, x = df.index。完成状态:bar_width和x变量已定义,供后续绘图调用。

bar_width = 0.35  # 设置柱状图的宽度
x = df.index  # 设置x轴的位置

第4步:调用bar()绘制双层堆叠柱状图

目的:创建图形对象并按列叠加绘制。入口:matplotlib的subplots()与ax.bar()。动作:初始化画布(fig, ax),分别对'销售数量'和'销售数量2'两列调用bar,其中第二组使用bottom=df['销售数量']实现堆叠。完成状态:生成两个矩形容器对象rects1和rects2,图表底层结构就绪。

fig, ax = plt.subplots()
rects1 = ax.bar(x, df['销售数量'], bar_width, label='销售数量')
rects2 = ax.bar(x, df['销售数量2'], bar_width, bottom=df['销售数量'], label='销售数量2')

第5步:标注坐标轴与图例信息

目的:提升图表可读性,标明单位与分类。动作:依次设置xlabel、ylabel、title,刷新xticks标签,并显示图例。完成状态:图表带有明确的轴标题和分类标识。

ax.set_xlabel('店铺名称')
ax.set_ylabel('销售数量')
ax.set_title('Stacked Bar Chart')
ax.set_xticks(x)
ax.set_xticklabels(df['店铺名称'])
ax.legend()

第6步:手动添加数值标签注解

目的:在每根柱子顶端显示具体数值。动作:遍历每个矩形对象,计算高度并使用annotate添加文字偏移3像素居中显示。关键逻辑:第一层直接取高度,第二层累加前后两层高度之和作为标注基准点。完成状态:柱顶出现对应数字标识。

for rect in rects1:
    height = rect.get_height()
    ax.annotate(f'{height}', xy=(rect.get_x() + rect.get_width() / 2, height), xytext=(0, 3),
                textcoords='offset points', ha='center', va='bottom')

for rect1, rect2 in zip(rects1, rects2):
    height1 = rect1.get_height()
    height2 = rect2.get_height()
    total_height = height1 + height2
    ax.annotate(f'{height2}', xy=(rect2.get_x() + rect2.get_width() / 2, total_height), xytext=(0, 3),
                textcoords='offset points', ha='center', va='bottom')

第7步:调用show()输出可视化结果

目的:触发前端界面渲染并弹出窗口查看。动作:执行plt.show()阻塞程序直至窗口关闭。完成状态:屏幕显示完整堆叠柱状图预览。

plt.show()
由pandas与matplotlib生成的双系列堆叠柱状图,横轴为店铺名称,纵轴表示累计销售数量
图表展示了五个店铺的两阶段销售总量对比,顶部数值代表第二段增量贡献

验证成功与否的标准

  • 图表无红字报错提示运行终止
  • 弹出的GUI窗口内呈现整齐的垂直堆叠矩形阵列
  • 每个柱顶均有对应区间对应的整数型文本标记

常见问题排查指南

若遇到以下情况请按优先级检查:

  1. 中文字体缺失导致方框:请确认操作系统内置SimHei.ttf或更换兼容字体如Microsoft YaHei
  2. FileNotFoundError异常:核对read_excel()传参中的绝对路径是否存在拼写错误或权限不足
  3. 图像重叠错位:调整bar_width值至合适范围(建议介于0.2~0.5之间)避免遮挡相邻柱体
  4. 标签重叠拥挤:可在annotate处修改xytext偏移量加大间距
以上就是使用Python配合pandas及matplotlib高效构建堆叠柱状图的详细内容,更多关于Python数据可视化技术的资料请关注本站其它相关文章!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表