周五下午三点,部门群里弹出一条消息:"各位,下周一汇报的各季度运营数据ppt,今晚12点前发我合并。"小王盯着屏幕愣了五秒,扭头看了一眼角落里堆积如山的excel表格——十二个季度的销售数据、八个区域的业绩对比、二十多条产品线的趋势分析。
打开powerpoint,新建幻灯片,插入图表,编辑数据,调整格式。重复,重复,再重复。三个小时后,他才做完三分之一。窗外天黑了下来,屏幕上还躺着十几个待生成的图表。
这种场景,做数据分析、运营、财务、咨询的朋友应该都不陌生。每周、每月、每季度,同样的数据源,同样的图表类型,同样的格式调整,一遍又一遍地手动操作。不是工作有多难,而是重复劳动实在太耗人。
python能解决这个问题。借助python-pptx这个库,你可以在代码里定义图表、填充数据、调整格式,让计算机替你完成那些机械重复的操作。下面这份教程,我会带着你从零开始,一步步写出能自动生成ppt图表的python脚本。
先装好工具包
开始之前,需要安装python-pptx库。打开命令行,输入这行命令:
pip install python-pptx
安装完成后,在python脚本里导入它:
from pptx import presentation from pptx.chart.data import categorychartdata from pptx.enum.chart import xl_chart_type from pptx.util import inches from pptx.dml.color import rgbcolor
这些模块各有用处:presentation负责创建和读取ppt文件,categorychartdata用来组织图表数据,xl_chart_type定义了图表类型,inches用于设置尺寸,rgbcolor则是调色用的。
新建幻灯片并添加柱状图
先从最基础的操作开始——创建一个新的ppt文件,添加一张幻灯片,然后在上面画一个柱状图。
# 创建一个新的演示文稿
prs = presentation()
# 添加一张空白幻灯片(版式6通常是空白)
slide = prs.slides.add_slide(prs.slide_layouts[6])
# 准备图表数据
chart_data = categorychartdata()
# 设置横轴(x轴)的类别
chart_data.categories = ['华东', '华南', '华北', '西南', '东北']
# 添加一个数据系列
chart_data.add_series('2025年销售额', (42.5, 38.2, 35.7, 28.3, 22.8))
# 设置图表位置和大小
x, y, cx, cy = inches(1), inches(1.5), inches(8), inches(5)
# 添加图表到幻灯片
chart_frame = slide.shapes.add_chart(
xl_chart_type.column_clustered, x, y, cx, cy, chart_data
)
# 保存文件
prs.save('sales_chart.pptx')
运行这段代码,打开生成的ppt文件,你会看到一张包含五个地区柱状图的幻灯片。数据已经填好,图表自动生成。
折线图展示趋势变化
如果是展示时间序列数据,折线图更合适。换一种图表类型就行:
# 准备折线图数据
chart_data = categorychartdata()
# x轴是时间
chart_data.categories = ['q1', 'q2', 'q3', 'q4']
# 添加三个系列的数据
chart_data.add_series('产品a', (12.3, 15.6, 18.2, 21.7))
chart_data.add_series('产品b', (8.5, 11.2, 14.8, 16.3))
chart_data.add_series('产品c', (5.2, 7.8, 9.5, 12.1))
# 添加折线图
chart_frame = slide.shapes.add_chart(
xl_chart_type.line, x, y, cx, cy, chart_data
)
chart = chart_frame.chart
# 给第一条线加上平滑效果
chart.series[0].smooth = true
折线图的代码结构和柱状图几乎一样,只是xl_chart_type换成了line。如果想生成带标记点的折线图,可以用line_with_markers。
饼图看占比
遇到占比分析的场景,饼图是标配。饼图的特殊之处在于只能有一个数据系列,而且没有坐标轴概念:
# 准备饼图数据
chart_data = categorychartdata()
chart_data.categories = ['直接销售', '渠道代理', '电商平台', '战略合作']
chart_data.add_series('2025年收入构成', (45.2, 28.7, 18.3, 7.8))
# 添加饼图
chart_frame = slide.shapes.add_chart(
xl_chart_type.pie, x, y, cx, cy, chart_data
)
chart = chart_frame.chart
# 显示图例
chart.has_legend = true
chart.legend.position = xl_legend_position.bottom
# 显示数据标签,并设置为百分比格式
chart.plots[0].has_data_labels = true
data_labels = chart.plots[0].data_labels
data_labels.number_format = '0%'
data_labels.position = xl_label_position.outside_end
设置数据标签格式时用到了number_format属性,'0%'表示显示为整数百分比。如果想保留一位小数,可以用'0.0%'。
散点图与气泡图
散点图和气泡图适合处理科学数据或连续变量的关系分析。它们的特殊之处在于数据点可以有自己的x值,不需要所有系列共享同一套x轴标签。
散点图代码示例:
from pptx.chart.data import xychartdata
# 准备散点图数据
chart_data = xychartdata()
series_1 = chart_data.add_series('模型a')
series_1.add_data_point(1.2, 3.4)
series_1.add_data_point(2.5, 4.1)
series_1.add_data_point(3.8, 2.7)
series_1.add_data_point(4.2, 5.3)
series_2 = chart_data.add_series('模型b')
series_2.add_data_point(1.5, 2.8)
series_2.add_data_point(2.8, 3.9)
series_2.add_data_point(3.2, 4.5)
series_2.add_data_point(4.5, 3.2)
# 添加散点图
chart_frame = slide.shapes.add_chart(
xl_chart_type.xy_scatter, x, y, cx, cy, chart_data
)
气泡图在此基础上多了一个尺寸参数,每个数据点需要提供x值、y值和气泡大小三个数值。
调整坐标轴让图表更专业
图表生成后,还可以对坐标轴做精细化调整。比如修改刻度范围、添加网格线、调整字体等:
from pptx.enum.chart import xl_tick_mark from pptx.util import pt chart = chart_frame.chart # 调整数值轴(y轴) value_axis = chart.value_axis value_axis.maximum_scale = 50.0 # 设置y轴最大值 value_axis.minimum_scale = 0.0 # 设置y轴最小值 value_axis.has_major_gridlines = true # 显示主要网格线 # 设置y轴标签格式为带百分号 value_axis.tick_labels.number_format = '0"万元"' value_axis.tick_labels.font.size = pt(12) value_axis.tick_labels.font.bold = true # 调整分类轴(x轴) category_axis = chart.category_axis category_axis.tick_labels.font.italic = true category_axis.tick_labels.font.size = pt(11)
通过tick_labels可以控制坐标轴上数字的字体、大小、粗体等属性,number_format则决定了数字显示的方式,比如加上单位或者转为百分比。
数据标签和图例
想让图表更清晰,数据标签和图例必不可少:
from pptx.enum.chart import xl_label_position, xl_legend_position # 添加数据标签 plot = chart.plots[0] plot.has_data_labels = true data_labels = plot.data_labels data_labels.font.size = pt(10) data_labels.position = xl_label_position.above # 标签显示在柱子上方 data_labels.font.color.rgb = rgbcolor(0x40, 0x40, 0x40) # 深灰色 # 调整图例 chart.has_legend = true chart.legend.position = xl_legend_position.top # 图例显示在顶部 chart.legend.font.size = pt(11)
数据标签的位置有多种选择,柱状图常用above或inside_end,饼图适合outside_end。
给图表换个颜色
默认的配色可能不符合公司品牌或者你的审美。可以通过设置主题色来调整,或者直接指定颜色:
# 修改第一个系列的填充颜色 series = chart.series[0] point = series.points[0] # 第一个数据点 point.format.fill.solid() point.format.fill.fore_color.rgb = rgbcolor(0x42, 0x85, 0xf4) # 蓝色 # 修改绘图区背景色 chart.plot_area.format.fill.solid() chart.plot_area.format.fill.fore_color.rgb = rgbcolor(0xf5, 0xf5, 0xf5) # 浅灰背景
python-pptx支持对单个数据点、整个系列、绘图区、图表区分别设置颜色,灵活性很高。
从excel读取数据自动生成
上面的例子都是手动输入数据。在实际工作中,数据通常存放在excel表格里。结合pandas和openpyxl,可以实现完全自动化的数据读取和图表生成:
import pandas as pd
from pptx import presentation
from pptx.chart.data import categorychartdata
from pptx.enum.chart import xl_chart_type
from pptx.util import inches
# 从excel读取数据
df = pd.read_excel('sales_data.xlsx', sheet_name='季度销售')
# 准备数据
categories = df['地区'].tolist()
series_data = {
'q1': df['q1'].tolist(),
'q2': df['q2'].tolist(),
'q3': df['q3'].tolist(),
'q4': df['q4'].tolist()
}
# 创建ppt
prs = presentation()
slide = prs.slides.add_slide(prs.slide_layouts[6])
# 填充图表数据
chart_data = categorychartdata()
chart_data.categories = categories
for quarter, values in series_data.items():
chart_data.add_series(quarter, values)
# 添加图表
x, y, cx, cy = inches(1), inches(1.5), inches(10), inches(6)
slide.shapes.add_chart(
xl_chart_type.column_clustered, x, y, cx, cy, chart_data
)
prs.save('auto_generated_report.pptx')
这段代码读取excel文件,取出地区和各季度销售额,自动生成一张包含四个系列的簇状柱状图。如果excel里有多张表、多个年份的数据,用循环可以批量生成几十张甚至上百张图表。
处理多图表幻灯片
有时候一张幻灯片上需要放多个图表。python-pptx支持在同一张幻灯片上添加多个图表,只要计算好各自的位置就行:
# 左侧图表
x1, y1, cx1, cy1 = inches(0.5), inches(1.5), inches(5), inches(4)
chart1 = slide.shapes.add_chart(
xl_chart_type.column_clustered, x1, y1, cx1, cy1, chart_data1
).chart
# 右侧图表
x2, y2, cx2, cy2 = inches(6), inches(1.5), inches(5), inches(4)
chart2 = slide.shapes.add_chart(
xl_chart_type.pie, x2, y2, cx2, cy2, chart_data2
).chart
获取图表对象时注意,add_chart返回的是包含图表的图形框(graphicframe),需要用.chart属性才能拿到真正的图表对象进行后续设置。
常见问题与解决
图表生成后打不开?检查下python-pptx版本,建议用最新版。图表数据不显示?确认数据格式是否正确,add_series接受列表或元组。中文显示乱码?ppt模板的字体问题,可以在母版里设置支持中文的字体。
颜色和预期不一样?默认颜色来自ppt模板的主题色,如果对颜色有严格要求,建议先准备好一个带自定义主题色的模板文件,然后用python-pptx打开这个模板添加内容。
生成几百页的大型ppt时内存占用过高?可以考虑分批次生成,或者每生成一页就保存一次,避免把所有内容都放在内存里。
总结
python自动生成ppt图表,不是要取代你做数据分析,而是帮你从机械重复的操作中解脱出来。把精力放在理解数据、发现规律、提炼观点上,让代码去处理那些复制粘贴、拖拽调整、重复格式化的琐事。
掌握这门技术后,再遇到"今晚12点前交ppt"的场景,你可以淡定地回复:"好的,五分钟后发你。"然后把excel拖进脚本,喝杯咖啡,看着电脑自动生成几十页图文并茂的报告。
说到底,工具的价值不在于它有多复杂,而在于它替你省下多少时间,让你能做那些真正需要人来做的事情。
以上就是python脚本自动生成powerpoint演示文件图表的详细内容,更多关于python生成powerpoint图表的资料请关注代码网其它相关文章!
发表评论