免费编程软件「python+pycharm」
链接:https://pan.quark.cn/s/48a86be2fdc0
周五下午三点,部门群里弹出一条消息:"各位,下周一汇报的各季度运营数据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拖进脚本,喝杯咖啡,看着电脑自动生成几十页图文并茂的报告。
说到底,工具的价值不在于它有多复杂,而在于它替你省下多少时间,让你能做那些真正需要人来做的事情。