Python如何绘制按年份、季度分组的销售数据分组柱状图
自动化实现方案
不需要手动构造嵌套列表,直接打通数据库读取、数据聚合、绘图全流程即可,全量30年数据处理耗时不到1秒,具体实现如下:
前置依赖安装
先安装需要的第三方库,执行以下命令:
pip install pymysql pandas matplotlib
完整实现代码
代码分为三个模块:MySQL数据拉取、数据格式转换、分组柱状图绘制,所有参数可根据你的实际表结构调整:
import pymysql import pandas as pd import matplotlib.pyplot as plt # 配置matplotlib中文显示,避免中文乱码 plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False # 1. 连接MySQL拉取聚合后的数据,不需要手动录入任何数值 # 替换为你自己的数据库连接信息 db_conn = pymysql.connect( host="127.0.0.1", port=3306, user="root", password="你的数据库密码", database="你的业务库名", charset="utf8mb4" ) # SQL直接做聚合,减少本地计算量:按年、季度分组统计总销售额 query_sql = """ SELECT Year, Quarter, SUM(Sales) AS quarter_sales FROM 你的销售数据表名 WHERE Year BETWEEN 1992 AND 2021 GROUP BY Year, Quarter ORDER BY Year, Quarter """ # 直接读取为DataFrame结构 sales_df = pd.read_sql(query_sql, db_conn) db_conn.close() # 2. 转换为绘图需要的宽表结构:行=年份,列=4个季度,值=对应季度销售额 pivot_df = sales_df.pivot(index="Year", columns="Quarter", values="quarter_sales") # 固定季度顺序为Q1-Q4,避免排序错乱 pivot_df = pivot_df.reindex(columns=[1, 2, 3, 4]) # 3. 绘制按年分组的季度柱状图 year_list = pivot_df.index.tolist() year_count = len(year_list) bar_width = 0.2 x_axis = range(year_count) plt.figure(figsize=(18, 7)) # 循环绘制4个季度的柱形 for q_idx in range(4): plt.bar( [pos + q_idx * bar_width for pos in x_axis], pivot_df.iloc[:, q_idx], width=bar_width, label=f"第{q_idx+1}季度" ) # 配置X轴刻度,位置对齐每个年份分组的中点 plt.xticks( [pos + bar_width * 1.5 for pos in x_axis], year_list, rotation=45 ) plt.xlabel("年份") plt.ylabel("销售额") plt.title("1992-2021年各季度销售额分布") plt.legend() plt.tight_layout() plt.show()
适配调整说明
- 如果你的表中Quarter字段是字符串格式(比如存储为"Q1""第1季度"),只需要修改
reindex里的列名匹配实际值即可,不需要改动其他逻辑 - 如果需要保留月度粒度做其他分析,可以直接拉取全表原始数据到本地,再用
pandas的groupby做年、季度聚合,逻辑和SQL聚合完全一致 - 后续新增年份数据不需要修改绘图逻辑,只要调整SQL中的年份过滤范围,代码会自动适配X轴的年份分组数量
- 如果需要调整柱形宽度、颜色、标签样式,直接修改
plt.bar对应的参数即可
内容的提问来源于stack exchange,提问作者Pishi
相关产品推荐
相关产品推荐

