Python 利用pandas和matplotlib绘制堆叠柱状图

在数据可视化中,堆叠柱状图是一种常用的图表类型,它能够清晰地展示多个类别的数据,并突出显示每个类别中各部分的总量和组成比例。本文将演示如何使用 Python 的 pandas 和 matplotlib 库绘制优化的堆叠柱状图,并展示了销售数量随店铺名称变化的情况。

导入必要的库

首先,我们需要导入 pandas 和 matplotlib.pyplot 库,并指定中文字体为黑体,代码如下:

复制代码
import pandas as pd
import matplotlib.pyplot as plt

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

读取数据

接下来,我们使用 pandas 的 read_excel 函数读取 Excel 文件中的数据,并指定读取的工作表名称为"Sheet3",如下所示:

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

设置图形参数

在绘制堆叠柱状图之前,我们需要设置柱状图的宽度和 x 轴的位置,代码如下:

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

绘制堆叠柱状图

使用 matplotlib 库的 subplots 函数创建图形对象,并使用 bar 函数绘制堆叠柱状图,具体代码如下:

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

添加标签和标题

我们为图形添加轴标签、标题、刻度和图例,使其更具可读性,具体代码如下:

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

显示数据标签

最后,我们使用 annotate 函数在每个柱子上方显示数据标签,以展示具体的销售数量,具体代码如下:

复制代码
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')

显示图形

最后,使用 plt.show() 函数显示绘制好的堆叠柱状图,代码如下:

复制代码
plt.show()

通过以上步骤,我们成功绘制出了堆叠柱状图,展示了不同店铺的销售数量情况。

图表效果图展示

完整代码:

复制代码
import pandas as pd
import matplotlib.pyplot as plt

plt.rcParams['font.family'] = ['SimHei']  # 指定中文字体为黑体
# 读取Excel文件
df = pd.read_excel(r'C:\Users\liuchunlin2\Desktop\新建文件夹\新建 XLSX 工作表.xlsx', sheet_name='Sheet3')
# 设置柱状图的宽度
bar_width = 0.35
# 设置x轴的位置
x = df.index

# 绘制堆叠柱状图
fig, ax = plt.subplots()
rects1 = ax.bar(x, df['销售数量'], bar_width, label='销售数量')
rects2 = ax.bar(x, df['销售数量2'], bar_width, bottom=df['销售数量'], label='销售数量2')

# 添加标签和标题
ax.set_xlabel('店铺名称')
ax.set_ylabel('销售数量')
ax.set_title('Stacked Bar Chart')
ax.set_xticks(x)
ax.set_xticklabels(df['店铺名称'])
ax.legend()

# 在每个柱子上方显示数据标签
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')

# 显示图形
plt.show()
相关推荐
瓦学妹10 小时前
什么是网络索引?它是如何工作的?
大数据·网络·python·网络爬虫
天天爱吃肉821810 小时前
商用车多体动力学实战笔记|第6篇:动力传动系统(发动机、变速箱、分动器、TCS、LSD限滑差速)
大数据·人工智能·笔记·python·嵌入式硬件·汽车
海盗123411 小时前
微软技术周报 ——2026-08-03
后端·python·microsoft·c#·.netcore
大数据魔法师11 小时前
【最全详解】DuckDB Python 全套 API 语法、参数与实战用法(零基础全覆盖)
python·数据分析
MC皮蛋侠客12 小时前
SQLAlchemy 系列(七):高级建模与高效写入——批量 DML、方言与扩展
数据库·python
Zane199412 小时前
@property 到底是怎么把方法伪装成属性的?一文吃透 property、staticmethod、classmethod
后端·python
qq_3164110313 小时前
AI 情感陪伴智能潮玩软硬件一体化开发案例
人工智能·python
废弃的小码农13 小时前
功能测试--Day07--Python编程基础
开发语言·python
zx11545013 小时前
大模型工具调用次数限制
人工智能·python
MC皮蛋侠客13 小时前
SQLAlchemy 系列(八):AsyncIO、并发与 Web 生命周期——让每个并发任务持有自己的 Session
数据库·python