数据可视化是演示文稿的核心功能之一。柱状图擅长展示离散类别的数值对比,折线图则更适合呈现连续时间段的趋势变化,两者的合理搭配能够让数据故事更加完整。在季度销售汇报、项目进度追踪、市场分析等场景中,手动在 powerpoint 中逐一创建图表并填写数据既繁琐又容易出错。通过 python 编程方式创建图表,可以将数据库或分析脚本中的数据直接映射到演示文稿中,实现图表生成的自动化和可复用。本文将介绍如何使用 python 在 powerpoint 中分别创建柱状图和折线图,以及将两种图表类型组合在同一图表中的实现方法。
环境准备
本文使用 spire.presentation for python 库来操作 powerpoint 图表。该库提供了 appendchartinit() 方法用于在幻灯片上创建各类图表,支持柱状图、折线图、饼图等多种图表类型。通过以下命令安装:
pip install spire.presentation
安装完成后,在脚本中导入 spire.presentation 模块即可开始使用。
创建簇状柱状图
柱状图以垂直柱形的高度表示数值大小,适合展示不同类别的数据对比。簇状柱状图将多个数据系列的柱形并排排列,便于在同一类别下比较多个系列的差异。创建图表时,需要先指定图表类型和位置区域,再通过 chartdata 二维表填充数据,最后将数据区域绑定到图表的系列和类别。
from spire.presentation.common import *
from spire.presentation import *
outputfile = "createcolumnchart.pptx"
# 创建演示文稿
presentation = presentation()
# 在第一张幻灯片上添加簇状柱状图
rect = rectanglef.fromltrb(90, 100, 640, 420)
chart = presentation.slides[0].shapes.appendchartinit(charttype.columnclustered, rect, false)
# 设置图表标题
chart.charttitle.textproperties.text = "季度销售额对比"
chart.charttitle.textproperties.iscentered = true
chart.charttitle.height = 30
chart.hastitle = true
# 定义数据
series1 = [7.7, 8.9, 1.0, 2.4]
series2 = [15.2, 5.3, 6.7, 8.0]
# 设置系列名称
chart.chartdata[0, 1].text = "产品a"
chart.chartdata[0, 2].text = "产品b"
# 设置类别名称
categories = ["第一季度", "第二季度", "第三季度", "第四季度"]
for i, cat in enumerate(categories):
chart.chartdata[i + 1, 0].text = cat
# 填充数值数据
for i in range(len(series1)):
chart.chartdata[i + 1, 1].numbervalue = series1[i]
chart.chartdata[i + 1, 2].numbervalue = series2[i]
# 绑定系列标签
chart.series.serieslabel = chart.chartdata["b1", "c1"]
# 绑定类别标签
chart.categories.categorylabels = chart.chartdata["a2", "a5"]
# 绑定系列值
chart.series[0].values = chart.chartdata["b2", "b5"]
chart.series[1].values = chart.chartdata["c2", "c5"]
presentation.savetofile(outputfile, fileformat.pptx2010)
presentation.dispose()

上述代码中,appendchartinit() 方法接收三个参数:图表类型 charttype.columnclustered 表示簇状柱状图,rectanglef.fromltrb(90, 100, 640, 420) 定义图表在幻灯片上的位置和大小(左、上、右、下坐标),第三个参数 false 表示不从模板加载已有数据。chartdata 是一个二维表对象,通过行列索引访问单元格——[0, 1] 和 [0, 2] 分别存储系列名称,[1, 0] 到 [4, 0] 存储类别名称,其余单元格存储数值数据。数据绑定使用 excel 式区域语法,如 chart.chartdata["b1", "c1"] 表示 b1 到 c1 的单元格范围。
创建带数据标记的折线图
折线图通过连接线展示数据随类别或时间的变化趋势,添加数据标记后每个数据点会显示为可见的形状,便于精确定位具体数值。折线图特别适合呈现连续时间维度上的变化轨迹,例如月度增长趋势、气温变化等。
from spire.presentation.common import *
from spire.presentation import *
outputfile = "createlinechart.pptx"
# 创建演示文稿
presentation = presentation()
# 添加带数据标记的折线图
rect = rectanglef.fromltrb(90, 100, 640, 420)
chart = presentation.slides[0].shapes.appendchartinit(charttype.linemarkers, rect, false)
# 设置图表标题
chart.charttitle.textproperties.text = "月度增长趋势"
chart.charttitle.textproperties.iscentered = true
chart.charttitle.height = 30
chart.hastitle = true
# 定义数据
series1 = [7.7, 8.9, 1.0, 2.4]
series2 = [15.2, 5.3, 6.7, 8.0]
# 设置系列和类别
chart.chartdata[0, 1].text = "线上渠道"
chart.chartdata[0, 2].text = "线下渠道"
for i, cat in enumerate(["一月", "二月", "三月", "四月"]):
chart.chartdata[i + 1, 0].text = cat
for i in range(len(series1)):
chart.chartdata[i + 1, 1].numbervalue = series1[i]
chart.chartdata[i + 1, 2].numbervalue = series2[i]
# 绑定数据区域
chart.series.serieslabel = chart.chartdata["b1", "c1"]
chart.categories.categorylabels = chart.chartdata["a2", "a5"]
chart.series[0].values = chart.chartdata["b2", "b5"]
chart.series[1].values = chart.chartdata["c2", "c5"]
presentation.savetofile(outputfile, fileformat.pptx2010)
presentation.dispose()

这段代码与柱状图的创建流程几乎一致,唯一的区别在于 appendchartinit() 的第一个参数从 charttype.columnclustered 变为 charttype.linemarkers。linemarkers 类型会在每个数据点位置绘制标记形状(圆形、方形等),并用直线连接相邻数据点。折线图的数据填充和区域绑定方式与柱状图完全相同,这说明图表的数据模型是统一的,不同图表类型只是在呈现层面的差异。
创建柱状图与折线图的组合图
在实际业务分析中,经常需要将不同量纲的数据放在同一张图表中展示。例如,柱状图展示销售额的绝对值,折线图展示增长率的百分比——两者的数值范围差异很大,需要借助次坐标轴来分别承载。组合图允许在同一图表中对不同系列指定不同的图表类型和坐标轴,实现多维数据的综合呈现。
from spire.presentation.common import *
from spire.presentation import *
outputfile = "combinationchart.pptx"
# 创建演示文稿
presentation = presentation()
# 先创建簇状柱状图
rect = rectanglef.fromltrb(100, 100, 650, 420)
chart = presentation.slides[0].shapes.appendchart(charttype.columnclustered, rect)
# 设置图表标题
chart.charttitle.textproperties.text = "月度销售与增长率"
chart.charttitle.textproperties.iscentered = true
chart.charttitle.height = 30
chart.hastitle = true
# 定义数据
months = ["一月", "二月", "三月", "四月", "五月", "六月"]
sales = [200, 250, 300, 150, 200, 400]
growth_rate = [0.6, 0.8, 0.6, 0.2, 0.5, 0.9]
# 填充表头
for c, text in enumerate(["月份", "销售额", "增长率"]):
chart.chartdata[0, c].text = text
# 填充类别和数据
for m, text in enumerate(months):
chart.chartdata[m + 1, 0].text = text
for s, num in enumerate(sales):
chart.chartdata[s + 1, 1].numbervalue = num
for g, num in enumerate(growth_rate):
chart.chartdata[g + 1, 2].numbervalue = num
# 绑定系列和类别标签
chart.series.serieslabel = chart.chartdata["b1", "c1"]
chart.categories.categorylabels = chart.chartdata["a2", "a7"]
chart.series[0].values = chart.chartdata["b2", "b7"]
chart.series[1].values = chart.chartdata["c2", "c7"]
# 将第二个系列(增长率)的图表类型改为折线图
chart.series[1].type = charttype.linemarkers
# 将第二个系列绘制到次坐标轴
chart.series[1].usesecondaxis = true
# 设置次坐标轴的数字格式为百分比
chart.secondaryvalueaxis.numberformat = "0%"
# 隐藏次坐标轴的网格线
chart.secondaryvalueaxis.majorgridtextlines.filltype = fillformattype.none
# 设置柱形间距
chart.overlap = -50
chart.gapwidth = 200
presentation.savetofile(outputfile, fileformat.pptx2010)
presentation.dispose()

上述代码首先以柱状图为基础创建图表,然后通过 chart.series[1].type = charttype.linemarkers 将第二个系列的图表类型单独改为折线图,从而实现柱状图与折线图的混排。chart.series[1].usesecondaxis = true 将折线系列绑定到次坐标轴,使其拥有独立的数值范围。次坐标轴的格式通过 chart.secondaryvalueaxis 访问,numberformat = "0%" 将数值显示为百分比形式。majorgridtextlines.filltype = fillformattype.none 隐藏次坐标轴的主网格线,避免与主坐标轴网格线交叉造成视觉混乱。overlap = -50 控制同类别内柱形的重叠程度(负值表示分离),gapwidth = 200 控制不同类别之间的间距。
实用技巧
调整柱形间距和宽度
柱状图中柱形的间距直接影响图表的视觉密度。gapwidth 属性控制类别之间的间距,值越大柱形越细;overlap 属性控制同一类别内不同系列柱形之间的重叠程度,正值表示重叠,负值表示分离。通过调整这两个参数,可以在紧凑展示和清晰留白之间取得平衡。
为折线图添加趋势线
折线图可以添加趋势线来展示数据的整体走向,帮助读者快速把握变化趋势。addtrendline() 方法支持线性、指数、多项式等多种趋势线类型。
# 为第一个系列添加线性趋势线 trendline = chart.series[0].addtrendline(trendlinestype.linear) trendline.displayequation = false trendline.displayrsquaredvalue = false
displayequation 控制是否在图表上显示趋势线方程,displayrsquaredvalue 控制是否显示 r² 拟合优度值。在演示文稿中通常关闭这两个选项以保持图表简洁。
配置坐标轴范围
默认情况下,powerpoint 会自动计算坐标轴的最大值和最小值。但在某些场景下需要手动指定范围,例如让所有图表使用统一的数值刻度以便横向对比。通过 primaryvalueaxis 可以控制主坐标轴的数值范围。
chart.primaryvalueaxis.isautomax = false chart.primaryvalueaxis.isautomin = false chart.primaryvalueaxis.minvalue = 0 chart.primaryvalueaxis.maxvalue = 500
在设置自定义范围之前,必须先将 isautomax 和 isautomin 设为 false,否则手动设置的值会被自动计算覆盖。
总结
本文介绍了使用 python 在 powerpoint 中创建柱状图、折线图及双轴组合图的方法。通过编程将业务数据自动映射为可视化图表,并灵活配置坐标轴与样式,能够实现图表生成的全自动化,大幅提升数据汇报的制作效率与信息传递效果。
以上就是python实现在powerpoint中创建柱状图和折线图的详细内容,更多关于python powerpoint创建柱状图和折线图的资料请关注代码网其它相关文章!
发表评论