Python 实现 Excel 数据可视化:柱状图制作教程

简介: 本文以运营人员小张的痛点切入,介绍如何用Python(pandas+matplotlib+openpyxl)自动化生成Excel销售柱状图。涵盖读取数据、绘制普通/堆叠/横向柱状图、美化样式、批量处理多文件、嵌入图表到Excel等实用技巧,助你将半小时手工操作压缩至十秒,实现高效、统一、可复用的数据可视化。(239字)


小张是公司里做运营分析的,每个月都要把销售数据整理成图表,给老板做汇报。以前他都是手动在Excel里点来点去,选数据范围、插入柱状图、调颜色、改字体,一套操作下来至少半小时。碰上数据更新频繁的日子,他得重复做三四遍同样的操作,烦到想摔鼠标。
代理 IP 使用小技巧 让你的数据抓取效率翻倍 (40).png

有一天他跑来问我:“有没有办法让Excel自动画图?我每次数据格式都一样,就是数值变了。”

我说:“用Python啊,写一次脚本,以后一键生成,颜色字体你说了算,还能批量处理。”

他眼睛亮了。

这篇文章就从这个场景出发,聊聊怎么用Python和Excel配合,优雅地画出各种柱状图。

准备工具,装三个库就够了
Python操作Excel有几个成熟的库。最省事的是pandas,它能直接读写Excel文件,处理数据表格。画图交给matplotlib,这个库几乎能画出所有你能想象到的图表。如果还想保留Excel公式或者调整格式,可以加上openpyxl。

装起来一句话的事情:

pip install pandas matplotlib openpyxl

我习惯在Jupyter Notebook里调试这些代码,因为能看到每一步的数据长什么样。如果你用普通.py文件也完全没问题。

拿数据开刀,从Excel读到pandas
先看一个实际场景。假设有一张销售数据表叫sales.xlsx,里面每个月每个产品的销售额:

月份 产品A 产品B 产品C
1月 120 95 80
2月 135 102 88
3月 148 110 92
用pandas读这个文件只需要一行:

import pandas as pd

df = pd.read_excel('sales.xlsx')
print(df.head())

head()方法能让你看一眼前几行数据,确认读进来的格式对不对。pandas会自动把第一行当作列名,后面每一行对应一个月份。

第一张柱状图,五步搞定
数据在手里了,画图其实就五步:选数据、创建画布、画柱状图、加标题标签、显示或保存。

import matplotlib.pyplot as plt

把月份列作为横坐标的标签

months = df['月份']

遍历每一列产品,分别画一组柱子

plt.bar(months, df['产品A'], label='产品A')
plt.bar(months, df['产品B'], label='产品B')
plt.bar(months, df['产品C'], label='产品C')

加标签和标题

plt.xlabel('月份')
plt.ylabel('销售额(万元)')
plt.title('各产品月度销售对比')

显示图例

plt.legend()

展示图表

plt.show()

跑完这段代码,一张简单的分组柱状图就弹出来了。每个月份有三根柱子并排,代表三个产品的销售额。

这比在Excel里手动选区域、插入图表快多了。但还不够好看,柱子颜色、字体大小、网格线都可以调。

让图表好看一点,细节决定质感
默认的matplotlib图表长得很“学术”,蓝橘色的柱子,白色背景,谈不上难看但也说不上精致。改几个参数就能大变样。

设置中文字体,不然图表里的中文会变成方框

plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

创建画布时指定尺寸和分辨率

fig, ax = plt.subplots(figsize=(10, 6), dpi=100)

画图时自定义颜色和透明度

ax.bar(months, df['产品A'], label='产品A', color='#FF6B6B', alpha=0.8)
ax.bar(months, df['产品B'], label='产品B', color='#4ECDC4', alpha=0.8)
ax.bar(months, df['产品C'], label='产品C', color='#45B7D1', alpha=0.8)

添加网格线,提升可读性

ax.grid(axis='y', linestyle='--', alpha=0.5)

在柱子上方显示数值

for i, (a, b, c) in enumerate(zip(df['产品A'], df['产品B'], df['产品C'])):
ax.text(i, a + 2, str(a), ha='center', va='bottom', fontsize=9)
ax.text(i, b + 2, str(b), ha='center', va='bottom', fontsize=9)
ax.text(i, c + 2, str(c), ha='center', va='bottom', fontsize=9)

plt.tight_layout()
plt.show()

alpha参数控制透明度,多个柱子重叠时能看到后面的内容。grid加网格线能让数值对比更直观。text方法在柱子上方标了具体数字,老板看图表时不用再猜这根柱子到底是多少。

颜色代码用的是十六进制RGB格式,比默认的颜色高级不少。可以在网上搜配色方案,选一套自己看着舒服的。

两种特殊柱状图,应付不同场景
有时候并排柱子太多了,显得拥挤。可以换成堆叠柱状图,每个月份的三根柱子叠在一起,总高度就是三个产品的销售额之和。

堆叠柱状图

fig, ax = plt.subplots(figsize=(10, 6))

ax.bar(months, df['产品A'], label='产品A', color='#FF6B6B')
ax.bar(months, df['产品B'], bottom=df['产品A'], label='产品B', color='#4ECDC4')
ax.bar(months, df['产品C'], bottom=df['产品A'] + df['产品B'], label='产品C', color='#45B7D1')

ax.set_ylabel('总销售额(万元)')
ax.legend()
plt.show()

bottom参数决定了这根柱子从哪里开始堆叠。产品B的柱子底端是产品A的高度,产品C的柱子底端是A加B的高度。这种图适合展示“总量”和“构成”的关系。

还有一种需求是横向柱状图。当产品名称或者月份标签比较长时,竖着放会挤在一起看不清。barh方法画横着的版本:

横向柱状图

ax.barh(months, df['产品A'], label='产品A')
ax.barh(months, df['产品B'], label='产品B')
ax.barh(months, df['产品C'], label='产品C')

只是把bar换成了barh,x轴和y轴的角色互换了。

批量生成图表,十分钟的工作变成十秒钟
这才是Python真正的杀手锏。假设你有12个分公司的销售数据,分别存在12个Excel文件里,每个文件要生成一张柱状图。手动做的话,打开、复制、粘贴、调整格式,一上午就没了。

用Python写个循环,几秒钟跑完。

import glob

获取所有Excel文件

files = glob.glob('分公司销售数据/*.xlsx')

for file in files:
df = pd.read_excel(file)

# 从文件名提取分公司名称,用来命名输出的图片
company_name = file.split('/')[-1].replace('.xlsx', '')

fig, ax = plt.subplots(figsize=(10, 6))
ax.bar(df['月份'], df['销售额'], color='steelblue')
ax.set_title(f'{company_name}月度销售情况')
ax.set_xlabel('月份')
ax.set_ylabel('销售额(万元)')

# 不显示窗口,直接保存文件
plt.savefig(f'图表输出/{company_name}_柱状图.png', dpi=150, bbox_inches='tight')
plt.close()

这里有两个关键点。savefig代替show,不弹窗口直接存图。bbox_inches='tight'能自动裁剪掉图表周围多余的空白。循环结束后,指定文件夹里整整齐齐躺着12张图片,每一张都格式统一、标题自动适配。

把图表写回Excel,方便分享
有些人不想单独看图片文件,希望图表直接嵌入到Excel表格里。这也能做到,用openpyxl配合matplotlib。

from openpyxl import Workbook
from openpyxl.utils.dataframe import dataframe_to_rows
from openpyxl.drawing.image import Image
import io

先把图表存到内存里的字节流,不生成临时文件

buf = io.BytesIO()
plt.savefig(buf, format='png', dpi=100)
buf.seek(0)

新建Excel文件并写入数据

wb = Workbook()
ws = wb.active

将pandas数据写入工作表

for r in dataframe_to_rows(df, index=False, header=True):
ws.append(r)

插入图片

img = Image(buf)
img.width = 400
img.height = 300
ws.add_image(img, 'E2') # 放在E2单元格位置

wb.save('带图表的销售报表.xlsx')

这样生成的文件,别人打开就能直接看到数据和图表,不需要额外发图片。

几个让我踩过坑的小问题
中文字体是最容易翻车的。matplotlib默认字体不支持中文,画出来的图里汉字全是小方框。解决方案是提前设置字体,用rcParams指定一个系统中存在的支持中文的字体。如果是在Linux服务器上跑,可能需要先安装中文字体,或者用fc-list :lang=zh命令查一下已安装的字体。

数据列名不要有空格。pandas读取Excel后,如果列名是“产品 A”这种带空格的,调用df['产品 A']会报错。要么提前改好列名,要么用df.columns = [col.strip() for col in df.columns]批量清理。

保存图表时如果中文变成了乱码,试试plt.savefig之前再加一次字体设置。有时候前面设好了,保存时却丢失了,重新设置能解决。

从手动到自动,效率提升看得见
小张后来用这套脚本,每月做报表的时间从半小时压缩到了十秒钟。他只需要把最新的数据覆盖到Excel文件里,双击运行脚本,图表自动生成。他把脚本给了部门其他同事,大家都很开心。

数据可视化的核心价值不是图表多漂亮,而是能不能快速准确地传达信息。当你重复做同一类图表超过三次,就该考虑写脚本了。这不是偷懒,是聪明地工作。

Excel和Python不是替代关系,是互补关系。Excel适合交互式探索数据,Python适合批量化、自动化处理。两者结合,威力翻倍。

目录
相关文章
|
7天前
|
人工智能 数据可视化 安全
王炸组合!阿里云 OpenClaw X 飞书 CLI,开启 Agent 基建狂潮!(附带免费使用6个月服务器)
本文详解如何用阿里云Lighthouse一键部署OpenClaw,结合飞书CLI等工具,让AI真正“动手”——自动群发、生成科研日报、整理知识库。核心理念:未来软件应为AI而生,CLI即AI的“手脚”,实现高效、安全、可控的智能自动化。
34476 17
王炸组合!阿里云 OpenClaw X 飞书 CLI,开启 Agent 基建狂潮!(附带免费使用6个月服务器)
|
19天前
|
人工智能 JSON 机器人
让龙虾成为你的“公众号分身” | 阿里云服务器玩Openclaw
本文带你零成本玩转OpenClaw:学生认证白嫖6个月阿里云服务器,手把手配置飞书机器人、接入免费/高性价比AI模型(NVIDIA/通义),并打造微信公众号“全自动分身”——实时抓热榜、AI选题拆解、一键发布草稿,5分钟完成热点→文章全流程!
45307 142
让龙虾成为你的“公众号分身” | 阿里云服务器玩Openclaw
|
8天前
|
人工智能 JSON 监控
Claude Code 源码泄露:一份价值亿元的 AI 工程公开课
我以为顶级 AI 产品的护城河是模型。读完这 51.2 万行泄露的源码,我发现自己错了。
4870 21
|
1天前
|
人工智能 自然语言处理 安全
Claude Code 全攻略:命令大全 + 实战工作流(建议收藏)
本文介绍了Claude Code终端AI助手的使用指南,主要内容包括:1)常用命令如版本查看、项目启动和更新;2)三种工作模式切换及界面说明;3)核心功能指令速查表,包含初始化、压缩对话、清除历史等操作;4)详细解析了/init、/help、/clear、/compact、/memory等关键命令的使用场景和语法。文章通过丰富的界面截图和场景示例,帮助开发者快速掌握如何通过命令行和交互界面高效使用Claude Code进行项目开发,特别强调了CLAUDE.md文件作为项目知识库的核心作用。
1950 6
Claude Code 全攻略:命令大全 + 实战工作流(建议收藏)
|
7天前
|
人工智能 API 开发者
阿里云百炼 Coding Plan 售罄、Lite 停售、Pro 抢不到?最新解决方案
阿里云百炼Coding Plan Lite已停售,Pro版每日9:30限量抢购难度大。本文解析原因,并提供两大方案:①掌握技巧抢购Pro版;②直接使用百炼平台按量付费——新用户赠100万Tokens,支持Qwen3.5-Max等满血模型,灵活低成本。
1809 5
阿里云百炼 Coding Plan 售罄、Lite 停售、Pro 抢不到?最新解决方案