使用 Python 在 PowerPoint 中创建柱状图和折线图

0 阅读7分钟

数据可视化是演示文稿的核心功能之一。柱状图擅长展示离散类别的数值对比,折线图则更适合呈现连续时间段的趋势变化,两者的合理搭配能够让数据故事更加完整。在季度销售汇报、项目进度追踪、市场分析等场景中,手动在 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()

在 PowerPoint 中创建柱状图.jpg

上述代码中,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()

在 PowerPoint 中创建折线图.jpg

这段代码与柱状图的创建流程几乎一致,唯一的区别在于 AppendChartInit() 的第一个参数从 ChartType.ColumnClustered 变为 ChartType.LineMarkersLineMarkers 类型会在每个数据点位置绘制标记形状(圆形、方形等),并用直线连接相邻数据点。折线图的数据填充和区域绑定方式与柱状图完全相同,这说明图表的数据模型是统一的,不同图表类型只是在呈现层面的差异。

创建柱状图与折线图的组合图

在实际业务分析中,经常需要将不同量纲的数据放在同一张图表中展示。例如,柱状图展示销售额的绝对值,折线图展示增长率的百分比——两者的数值范围差异很大,需要借助次坐标轴来分别承载。组合图允许在同一图表中对不同系列指定不同的图表类型和坐标轴,实现多维数据的综合呈现。

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()

创建复合式图表.jpg

上述代码首先以柱状图为基础创建图表,然后通过 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

在设置自定义范围之前,必须先将 IsAutoMaxIsAutoMin 设为 False,否则手动设置的值会被自动计算覆盖。

总结

本文介绍了使用 Python 在 PowerPoint 中创建柱状图、折线图及双轴组合图的方法。通过编程将业务数据自动映射为可视化图表,并灵活配置坐标轴与样式,能够实现图表生成的全自动化,大幅提升数据汇报的制作效率与信息传递效果。