PPT自动化 python-pptx - 9: 图表(chart)
一、前言:认识 python-pptx 的图表功能
python-pptx 是一款用于创建和修改 PowerPoint(.pptx)文件的 Python 库,其图表功能支持除 3D 类型外的绝大多数常见图表(如柱状图、折线图、饼图等)。本文将详细讲解如何用该库在 PPT 中添加、定制各类图表,并提供可直接运行的代码示例。
二、基础图表的创建
2.1 单系列图表:以簇状柱形图为例
单系列图表适用于展示单一维度的数据对比(如不同区域的同一指标)。
from pptx import Presentation
from pptx.chart.data import CategoryChartData # 分类图表数据类
from pptx.enum.chart import XL_CHART_TYPE # 图表类型枚举
from pptx.util import Inches # 尺寸单位(英寸)# 1. 创建演示文稿和幻灯片(使用“空白”版式,索引5)
prs = Presentation()
slide = prs.slides.add_slide(prs.slide_layouts[5])# 2. 定义图表数据
chart_data = CategoryChartData()
chart_data.categories = ['东区', '西区', '中西部'] # X轴标签(分类)
chart_data.add_series('2023年销售额', (19.2, 21.4, 16.7)) # 系列名称+数值# 3. 添加图表到幻灯片(位置:x=2英寸,y=2英寸;大小:宽6英寸,高4.5英寸)
x, y, cx, cy = Inches(2), Inches(2), Inches(6), Inches(4.5)
slide.shapes.add_chart(XL_CHART_TYPE.COLUMN_CLUSTERED, # 图表类型:簇状柱形图x, y, cx, cy, chart_data
)# 4. 保存文件
prs.save('单系列柱形图.pptx')
2.2 多系列图表:对比多维度数据
多系列图表可同时展示多个维度的数据(如不同季度的区域销售额),核心是添加多个数据系列。
# (省略与单系列相同的导入和幻灯片创建代码)# 1. 定义多系列数据
chart_data = CategoryChartData()
chart_data.categories = ['东区', '西区', '中西部'] # 分类(X轴)
chart_data.add_series('Q1', (19.2, 21.4, 16.7)) # 系列1:Q1销售额
chart_data.add_series('Q2', (22.3, 28.6, 15.2)) # 系列2:Q2销售额
chart_data.add_series('Q3', (20.4, 26.3, 14.2)) # 系列3:Q3销售额# 2. 添加图表并获取图表对象(后续定制需用)
x, y, cx, cy = Inches(2), Inches(2), Inches(6), Inches(4.5)
# add_chart返回“图形框架”,需通过.chart属性获取图表对象
graphic_frame = slide.shapes.add_chart(XL_CHART_TYPE.COLUMN_CLUSTERED, x, y, cx, cy, chart_data
)
chart = graphic_frame.chart # 关键:获取图表对象用于后续定制prs.save('多系列柱形图.pptx')
三、特殊图表类型:XY 散点图与气泡图
当 X 轴为连续值(如时间、温度)时,需使用 XY 散点图;若需展示第三个维度(如 “权重”),则用气泡图(气泡大小表示第三维度)。
3.1 XY 散点图:展示连续变量关系
XY 散点图的每个数据点需明确 (x, y) 坐标,且不同系列可拥有不同 X 值。
from pptx.chart.data import XyChartData # XY图表数据类# (省略演示文稿和幻灯片创建代码)# 1. 定义XY散点图数据
chart_data = XyChartData()# 添加系列1:模型A的(x,y)数据点
series_a = chart_data.add_series('模型A')
series_a.add_data_point(0.7, 2.7) # (x=0.7, y=2.7)
series_a.add_data_point(1.8, 3.2)
series_a.add_data_point(2.6, 0.8)# 添加系列2:模型B的(x,y)数据点
series_b = chart_data.add_series('模型B')
series_b.add_data_point(1.3, 3.7)
series_b.add_data_point(2.7, 2.3)
series_b.add_data_point(1.6, 1.8)# 2. 添加散点图
x, y, cx, cy = Inches(2), Inches(2), Inches(6), Inches(4.5)
chart = slide.shapes.add_chart(XL_CHART_TYPE.XY_SCATTER, # 图表类型:散点图x, y, cx, cy, chart_data
).chart # 直接获取图表对象prs.save('XY散点图.pptx')
3.2 气泡图:展示三维数据
气泡图在散点图基础上,通过气泡大小增加第三个维度(如 “样本量”“重要性”)。
from pptx.chart.data import BubbleChartData # 气泡图数据类# (省略演示文稿和幻灯片创建代码)# 1. 定义气泡图数据(每个点含x, y, 气泡大小)
chart_data = BubbleChartData()
series = chart_data.add_series('产品数据')
series.add_data_point(0.7, 2.7, 10) # (x=0.7, y=2.7, 大小=10)
series.add_data_point(1.8, 3.2, 4) # 气泡越小,数值越小
series.add_data_point(2.6, 0.8, 8)# 2. 添加气泡图
x, y, cx, cy = Inches(2), Inches(2), Inches(6), Inches(4.5)
chart = slide.shapes.add_chart(XL_CHART_TYPE.BUBBLE, # 图表类型:气泡图x, y, cx, cy, chart_data
).chartprs.save('气泡图.pptx')
四、图表元素定制:让图表更专业
创建图表后,可通过定制坐标轴、数据标签、图例等元素提升可读性。
4.1 坐标轴定制:控制刻度、网格线与格式
坐标轴(X 轴为类别轴,Y 轴为数值轴)可调整范围、刻度、标签格式等。
from pptx.enum.chart import XL_TICK_MARK # 刻度线类型
from pptx.util import Pt # 字体单位(磅)# (假设已创建chart对象,以多系列柱形图为例)# 1. 定制类别轴(X轴)
category_axis = chart.category_axis
category_axis.has_major_gridlines = True # 显示主要网格线
category_axis.minor_tick_mark = XL_TICK_MARK.OUTSIDE # 次要刻度线朝外
category_axis.tick_labels.font.italic = True # 刻度标签斜体
category_axis.tick_labels.font.size = Pt(10) # 标签字体10磅# 2. 定制数值轴(Y轴)
value_axis = chart.value_axis
value_axis.maximum_scale = 50.0 # Y轴最大值设为50
value_axis.has_minor_gridlines = True # 显示次要网格线
# 刻度标签格式:显示为百分比(如25%)
value_axis.tick_labels.number_format = '0"%"'
value_axis.tick_labels.font.bold = True # 标签加粗prs.save('定制坐标轴.pptx')
4.2 数据标签:直接显示数值
数据标签可在图表元素(如柱顶、折线点)上显示具体数值,需通过 “绘图区(plot)” 设置。
from pptx.dml.color import RGBColor # RGB颜色
from pptx.enum.chart import XL_LABEL_POSITION # 标签位置# (假设已创建chart对象)# 获取第一个绘图区(多数图表只有1个绘图区)
plot = chart.plots[0]
plot.has_data_labels = True # 启用数据标签
data_labels = plot.data_labels# 定制标签样式
data_labels.font.size = Pt(9) # 9磅字体
data_labels.font.color.rgb = RGBColor(0x0A, 0x42, 0x80) # 深蓝色
data_labels.position = XL_LABEL_POSITION.INSIDE_END # 标签在柱形内部顶端prs.save('带数据标签.pptx')
4.3 图例:标识系列含义
图例用于说明不同颜色 / 形状对应的系列(如 “Q1”“Q2”),可调整位置和布局。
from pptx.enum.chart import XL_LEGEND_POSITION # 图例位置# (假设已创建chart对象)chart.has_legend = True # 显示图例
chart.legend.position = XL_LEGEND_POSITION.RIGHT # 图例放右侧
chart.legend.include_in_layout = False # 图例不占用图表主体空间prs.save('定制图例.pptx')
五、其他常用图表类型
5.1 折线图:展示趋势变化
折线图适合展示数据随时间的变化趋势,可设置线条平滑度。
# (省略演示文稿和幻灯片创建代码)# 1. 定义折线图数据
chart_data = CategoryChartData()
chart_data.categories = ['1月', '2月', '3月'] # X轴:月份
chart_data.add_series('产品A', (32.2, 28.4, 34.7)) # 产品A销量
chart_data.add_series('产品B', (24.3, 30.6, 20.2)) # 产品B销量# 2. 添加折线图
x, y, cx, cy = Inches(2), Inches(2), Inches(6), Inches(4.5)
chart = slide.shapes.add_chart(XL_CHART_TYPE.LINE, # 图表类型:折线图x, y, cx, cy, chart_data
).chart# 定制:产品A的线条设为平滑曲线
chart.series[0].smooth = Trueprs.save('折线图.pptx')
5.2 饼图:展示占比关系
饼图用于展示各部分占总体的比例,仅含一个系列,无坐标轴。
from pptx.enum.chart import XL_LEGEND_POSITION, XL_LABEL_POSITION
# (省略演示文稿和幻灯片创建代码)# 1. 定义饼图数据(数值代表占比)
chart_data = CategoryChartData()
chart_data.categories = ['手机', '电脑', '平板', '配件'] # 扇区标签
chart_data.add_series('销售额占比', (0.4, 0.3, 0.2, 0.1)) # 各部分占比(总和建议为1)# 2. 添加饼图
x, y, cx, cy = Inches(2), Inches(2), Inches(6), Inches(4.5)
chart = slide.shapes.add_chart(XL_CHART_TYPE.PIE, # 图表类型:饼图x, y, cx, cy, chart_data
).chart# 3. 定制图例和数据标签
chart.has_legend = True
chart.legend.position = XL_LEGEND_POSITION.BOTTOM # 图例在底部
# 数据标签:显示百分比,位置在扇区外(带引导线)
plot = chart.plots[0]
plot.has_data_labels = True
data_labels = plot.data_labels
data_labels.number_format = '0%' # 格式:30%
data_labels.position = XL_LABEL_POSITION.OUTSIDE_ENDprs.save('饼图.pptx')
六、补充说明
颜色管理
- 默认规则:python-pptx 会自动使用 PPT 主题的 “着色 1-6”(Accent 1-6)为系列分配颜色,超过 6 个系列则使用颜色变体。
- 最佳实践:如需统一配色,建议修改 PPT 模板的主题颜色(而非逐个设置系列颜色),新图表会自动继承主题配色,确保整体风格一致。