当前位置: 代码网 > it编程>前端脚本>Python > Python Excel数据可视化之柱状图绘制教程

Python Excel数据可视化之柱状图绘制教程

2026年04月09日 Python 我要评论
​小张是公司里做运营分析的,每个月都要把销售数据整理成图表,给老板做汇报。以前他都是手动在excel里点来点去,选数据范围、插入柱状图、调颜色、改字体,一套操作下来至少半小时。碰上数据更新频繁的日子,

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

有一天他跑来问我:“有没有办法让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月1209580
2月13510288
3月14811092

用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适合批量化、自动化处理。两者结合,威力翻倍。

以上就是python excel数据可视化之柱状图绘制教程的详细内容,更多关于python excel数据可视化的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com