Python Excel 高阶教程:使用 Spire.XLS 创建雷达图和折线图

在日常工作中,我们经常有着这样的场景需求:

  • 需要对比多个产品在多个维度(如性能、价格、用户体验)的表现
  • 分析销售数据随时间变化的趋势,识别峰值和低谷
  • 展示员工能力评估结果,直观呈现各维度得分
  • 追踪项目进度,可视化各阶段完成情况
  • ……

面对错综繁杂的海量数据时,光靠眼睛看一个个单元格是效率极低的。因此,我们需要一种高效的方法来处理这些数据:图表是 Excel 中强大的数据可视化工具,而 Spire.XLS for Python 库提供了便捷的图表创建功能,让开发者能够仅用几行代码就创建各种如柱形图、条形图、雷达图、折线图等的专业图表。这次就让我们来学习,如何使用 Spire.XLS 创建雷达图和折线图

前期准备

Spire.XLS for Python 库是本教程的中心,它提供的 API 允许我们在 Python 中对 Excel 文件进行各类操作,同时不依赖于外部软件,如 Microsoft Excel。

你可以通过以下 pip 命令将它们轻松安装到 Windows 中。

pip install spire.xls

或者通过 Spire.XLS for Python 下载 压缩文件,解压缩后从“lib”文件夹中获取 .whl 文件,再使用 pip 的 install 语句从 .whl 文件安装就可以了。

Spire.XLS for Python 官方在官方网站提供了详细的教程文档,如果还是不清楚如何安装,你可以尝试访问 安装指南 并寻求帮助。

一、雷达图

雷达图又称蜘蛛图,是一种显示二维多元数据的图形方法。图表上的每个辐条代表一个不同的变量,数据点沿着这些辐条绘制。雷达图尤其适用于比较不同实体在多个标准中的表现。本段将演示如何使用 Spire.XLS for Python 通过 Python 在 Excel 中创建两类雷达图。

应用场景

  • 标准雷达图:多维数据对比(员工能力评估、产品特性比较)
  • 填充雷达图:突出数据覆盖区域(能力范围、产品特性覆盖)

Python 创建标准雷达图

当你想要对比几件产品在多个维度的表现时,又或是表现几个方案在多个方面的优劣时,标准雷达图可以将数据可视化为图形,用简单的多色折线表示数据的相对于顶点或其他数据的高低,一目了然。
Spire.XLS for Python 提供了 Worksheet.Charts.Add(ExcelChartType.Radar) 方法,用于在 Excel 工作表中添加标准雷达图。

关键步骤如下:

  • 创建一个 Workbook 对象。
  • 使用 Workbook.LoadFromFile() 方法加载一个待处理的 Excel 文件
  • 使用 Workbook.Worksheets[index] 属性获取指定工作表。
  • 使用 Worksheet.Charts.Add(ExcelChartType.Radar) 方法在工作表中添加一个简单的雷达图。
  • 使用 Chart.DataRange 属性设置图表数据范围。
  • 设置图表的位置、图例和标题。
  • 使用 Workbook.SaveToFile() 方法保存结果文件。
from spire.xls import *
from spire.xls.common import *

# 创建 Workbook 对象
workbook = Workbook()

# 加载Excel文件
workbook.LoadFromFile("Microsoft Excel 工作表.xlsx")

# 获取第一个工作表
sheet = workbook.Worksheets[0]

# 在工作表中添加雷达图
chart = sheet.Charts.Add(ExcelChartType.Radar)

# 设置图标位置
chart.LeftColumn = 7
chart.TopRow = 2
chart.RightColumn = 15
chart.BottomRow = 22

# 设置图标的数据源
chart.DataRange = sheet.Range["A2:D8"]
chart.SeriesDataFromRange = False

# 设置图表标题
chart.ChartTitle = "某公司员工培训成绩图"
chart.ChartTitleArea.IsBold = True
chart.ChartTitleArea.Size = 18
chart.PlotArea.Fill.Visible = False
chart.Legend.Position = LegendPositionType.Corner

# 保存结果文件
workbook.SaveToFile("标准雷达图.xlsx", ExcelVersion.Version2016)
workbook.Dispose()

![Python 自动生成标准雷达图][image1]

Python 创建填充雷达图

填充雷达图是标准雷达图的一种变体,不同之处在于每个数据点之间的区域用颜色填充。

关键步骤如下:

  • 创建一个 Workbook 对象。
  • 使用 Workbook.LoadFromFile() 方法加载一个待处理的 Excel 文件
  • 使用 Workbook.Worksheets[index] 属性获取指定工作表。
  • 使用 Worksheet.Charts.Add(ExcelChartType.RadarFilled) 方法在工作表中添加一个填充雷达图。
  • 使用 Chart.DataRange 属性设置图表数据范围。
  • 设置图表的位置、图例和标题。
  • 使用 Workbook.SaveToFile() 方法保存结果文件。
from spire.xls import *
from spire.xls.common import *

# 创建 Workbook 对象
workbook = Workbook()

# 加载Excel文件
workbook.LoadFromFile("Microsoft Excel 工作表 1.xlsx")

# 获取第一个工作表
sheet = workbook.Worksheets[0]

# 在工作表中添加雷达图
chart = sheet.Charts.Add(ExcelChartType.RadarFilled)

# 设置图标位置
chart.LeftColumn = 7
chart.TopRow = 2
chart.RightColumn = 15
chart.BottomRow = 22

# 设置图标的数据源
chart.DataRange = sheet.Range["A2:D8"]
chart.SeriesDataFromRange = False

# 设置图表标题
chart.ChartTitle = "某公司员工培训成绩图"
chart.ChartTitleArea.IsBold = True
chart.ChartTitleArea.Size = 18
chart.PlotArea.Fill.Visible = False
chart.Legend.Position = LegendPositionType.Corner

# 保存结果文件
workbook.SaveToFile("填充雷达图.xlsx", ExcelVersion.Version2016)
workbook.Dispose()

Python 自动生成填充雷达图

二、折线图

折线图是一种通过直线连接数据点来展示信息的图表,特别适用于显示随时间变化的趋势。例如,在跟踪每月销售数据时,折线图可以帮助识别趋势、峰值和低谷。在本段中,我们将学习如何使用 Python 通过 Spire.XLS for Python 在 Excel 中创建两类折线图。

应用场景

  • 简单折线图:时间序列趋势分析(销售趋势、网站流量)
  • 堆积折线图:部分与整体关系分析(销售贡献占比、项目进度)

Python 创建简单折线图

现在你要关注数款产品在某个季度每个月销量的趋势,又或者要查看某地数个月以来的降雨量的变化趋势,使用折线图可以让繁杂的数据变为易懂的图表,还能同时查看其他类别的数据在同一时刻的变化。
Spire.XLS for Python 提供了 Worksheet.Charts.Add(ExcelChartType.Line) 方法,可帮助你在 Excel 工作表中快速添加简单折线图。

关键步骤如下:

  • 创建一个 Workbook 对象。
  • 使用 Workbook.LoadFromFile() 方法加载一个待处理的 Excel 文件
  • 使用 Workbook.Worksheets[index] 属性获取指定工作表。
  • 使用 Worksheet.Charts.Add(ExcelChartType.Line) 方法向工作表添加简单折线图。
  • 通过 Chart.DataRange 属性设置图表数据范围。
  • 设置图表的位置、标题、坐标轴及其它属性。
  • 使用 Workbook.SaveToFile() 方法保存文件。
from spire.xls import *
from spire.xls.common import *

# 创建 Workbook 对象
workbook = Workbook()

# 加载Excel文件
workbook.LoadFromFile("Microsoft Excel 工作表 2.xlsx")

# 获取第一个工作表
sheet = workbook.Worksheets[0]

# 在工作表中添加折线图
chart = sheet.Charts.Add(ExcelChartType.Line)

# 设置图表数据范围
chart.DataRange = sheet.Range["A2:E8"]

# 设置图表的位置
chart.LeftColumn = 7
chart.TopRow = 2
chart.RightColumn = 14
chart.BottomRow = 18

# 设置并格式化图表标题
chart.ChartTitle = "某公司年度各地市销售情况表(万元)"
chart.ChartTitleArea.IsBold = True
chart.ChartTitleArea.Size = 16

# 设置图表类别轴
chart.PrimaryCategoryAxis.Title = "季度"
chart.PrimaryCategoryAxis.Font.IsBold = True
chart.PrimaryCategoryAxis.TitleArea.IsBold = True

# 设置图表值轴
chart.PrimaryValueAxis.Title = "销售额(万元)"
chart.PrimaryValueAxis.HasMajorGridLines = False
chart.PrimaryValueAxis.TitleArea.TextRotationAngle = 90
chart.PrimaryValueAxis.MinValue = 100
chart.PrimaryValueAxis.TitleArea.IsBold = True

# 设置系列颜色和数据标签
for cs in chart.Series:
    cs.Format.Options.IsVaryColor = True
    cs.DataPoints.DefaultDataPoint.DataLabels.HasValue = True

# 设置图例位置
chart.Legend.Position = LegendPositionType.Right

# 保存结果文件
workbook.SaveToFile("简单折线图.xlsx", ExcelVersion.Version2016)
workbook.Dispose()

Python 自动生成简单折线图

Python 创建堆积折线图

现在你要在关注不同季度不同门店的销售额的变化,同时还要注意不同季度间总销售额的变化趋势,堆积折线图通过将每个类别的值堆积在一起,强调整体的总量变化,使数据系列对整体趋势的贡献更加直观。
Spire.XLS for Python 提供了 Worksheet.Charts.Add(ExcelChartType.LineStacked) 方法,让我们可以在 Excel 工作表中添加堆积折线图。

关键步骤如下:

  • 创建一个 Workbook 对象。
  • 使用 Workbook.LoadFromFile() 方法加载一个待处理的 Excel 文件
  • 使用 Workbook.Worksheets[index] 属性获取指定工作表。
  • 使用 Worksheet.Charts.Add(ExcelChartType.LineStacked) 方法在工作表中添加堆积折线图。
  • 通过 Chart.DataRange 属性设置图表数据范围。
  • 设置图表的位置、标题、坐标轴及其它属性。
  • 使用 Workbook.SaveToFile() 方法保存文件。
from spire.xls import *
from spire.xls.common import *

# 创建 Workbook 对象
workbook = Workbook()

# 加载Excel文件
workbook.LoadFromFile("Microsoft Excel 工作表 2.xlsx")

# 获取第一个工作表
sheet = workbook.Worksheets[0]

# 在工作表中添加折线图
chart = sheet.Charts.Add(ExcelChartType.LineStacked)

# 设置图表数据范围
chart.DataRange = sheet.Range["A2:E8"]

# 设置图表的位置
chart.LeftColumn = 7
chart.TopRow = 2
chart.RightColumn = 14
chart.BottomRow = 18

# 设置并格式化图表标题
chart.ChartTitle = "某公司年度各地市销售情况表(万元)"
chart.ChartTitleArea.IsBold = True
chart.ChartTitleArea.Size = 16

# 设置图表类别轴
chart.PrimaryCategoryAxis.Title = "季度"
chart.PrimaryCategoryAxis.Font.IsBold = True
chart.PrimaryCategoryAxis.TitleArea.IsBold = True

# 设置图表值轴
chart.PrimaryValueAxis.Title = "销售额(万元)"
chart.PrimaryValueAxis.HasMajorGridLines = False
chart.PrimaryValueAxis.TitleArea.TextRotationAngle = 90
chart.PrimaryValueAxis.MinValue = 100
chart.PrimaryValueAxis.TitleArea.IsBold = True

# 设置系列颜色和数据标签
for cs in chart.Series:
    cs.Format.Options.IsVaryColor = True
    cs.DataPoints.DefaultDataPoint.DataLabels.HasValue = True

# 设置图例位置
chart.Legend.Position = LegendPositionType.Right

# 保存结果文件
workbook.SaveToFile("堆积折线图.xlsx", ExcelVersion.Version2016)
workbook.Dispose()

Python 自动生成堆积折线图

三、总结与拓展

大家应该都发现了,使用Spire.XLS for Python创建图表,其语法大都很相似,在上面的四个示例中,我们分别创建了标准雷达图、填充雷达图、简单折线图和堆积折线图,而代码改变了的部分只有 sheet.Charts.Add() 中填充的 ExcelChartType 枚举值。

  • 标准雷达图:ExcelChartType.Radar
  • 填充雷达图:ExcelChartType.RadarFilled
  • 简单折线图:ExcelChartType.Line
  • 堆积折线图:ExcelChartType.LineStacked

这意味这什么?

实际上,我们在上一篇文章 Python Excel 高阶教程:使用 Spire.XLS 创建柱形图和条形图 中已经提到过一次这个特性了。我们当时还整理了柱形图和条形图的 ExcelChartType 枚举值:

  • 簇状柱形图:ExcelChartType.ColumnClustered
  • 堆叠柱形图:ExcelChartType.ColumnStacked
  • 簇状条形图:ExcelChartType.BarClustered
  • 堆叠条形图:ExcelChartType.BarStacked

意思是,Spire.XLS 的图表操作实际上相当重复,于是我们可以利用这个特性,用函数配合循环来快速创建多个不同类型的基本图表:

from spire.xls import *
from spire.xls.common import *


def AddExcelChart(FileNameIn: str, FileNameOut: str, ChartType: ExcelChartType,
                  DataRange: str, Title: str, TitleSize: int, TitleX: str,
                  TitleY: str, Legend: LegendPositionType):
    # 创建 Workbook 对象,加载Excel文件,获取第一个工作表
    workbook = Workbook()
    workbook.LoadFromFile(FileNameIn)
    sheet = workbook.Worksheets[0]
    
    # 添加图表并设置基本属性
    chart = sheet.Charts.Add(ChartType)
    chart.DataRange = sheet.Range[DataRange]
    chart.LeftColumn = 7
    chart.TopRow = 2
    chart.RightColumn = 14
    chart.BottomRow = 18
    
    # 公共标题设置
    chart.ChartTitle = Title
    chart.ChartTitleArea.IsBold = True
    chart.ChartTitleArea.Size = TitleSize
    
    # 图表类型特定配置
    config = {
        ExcelChartType.Radar: lambda: [
            setattr(chart, 'SeriesDataFromRange', False),
            setattr(chart.PlotArea.Fill, 'Visible', False)
        ],
        ExcelChartType.RadarFilled: lambda: [
            setattr(chart, 'SeriesDataFromRange', False),
            setattr(chart.PlotArea.Fill, 'Visible', False)
        ],
        ExcelChartType.Line: lambda: axis_config(chart, TitleX, TitleY, 100),
        ExcelChartType.LineStacked: lambda: axis_config(chart, TitleX, TitleY, 100),
        ExcelChartType.ColumnClustered: lambda: column_config(chart, TitleX, TitleY),
        ExcelChartType.ColumnStacked: lambda: column_config(chart, TitleX, TitleY),
        ExcelChartType.BarClustered: lambda: bar_config(chart, TitleX, TitleY, 1000),
        ExcelChartType.BarStacked: lambda: bar_config(chart, TitleX, TitleY, 1000)
    }
    
    # 应用特定配置
    if ChartType in config:
        config[ChartType]()
    
    # 公共图例设置
    chart.Legend.Position = Legend
    
    # 保存并释放资源
    workbook.SaveToFile(FileNameOut, ExcelVersion.Version2016)
    workbook.Dispose()


# 辅助函数:坐标轴配置
def axis_config(chart, title_x, title_y, min_val):
    # 分类轴设置
    if title_x:
        chart.PrimaryCategoryAxis.Title = title_x
        chart.PrimaryCategoryAxis.Font.IsBold = True
        chart.PrimaryCategoryAxis.TitleArea.IsBold = True
    
    # 数值轴设置
    if title_y:
        chart.PrimaryValueAxis.Title = title_y
        chart.PrimaryValueAxis.TitleArea.TextRotationAngle = 90
        chart.PrimaryValueAxis.TitleArea.IsBold = True
    
    chart.PrimaryValueAxis.HasMajorGridLines = False
    chart.PrimaryValueAxis.MinValue = min_val
    
    # 系列设置
    for series in chart.Series:
        series.Format.Options.IsVaryColor = True
        series.DataPoints.DefaultDataPoint.DataLabels.HasValue = True


# 辅助函数:柱形图配置
def column_config(chart, title_x, title_y):
    chart.SeriesDataFromRange = False
    
    # 坐标轴设置
    if title_x:
        chart.PrimaryCategoryAxis.Title = title_x
        chart.PrimaryCategoryAxis.Font.IsBold = True
        chart.PrimaryCategoryAxis.TitleArea.IsBold = True
    
    if title_y:
        chart.PrimaryValueAxis.Title = title_y
        chart.PrimaryValueAxis.TitleArea.TextRotationAngle = 90
        chart.PrimaryValueAxis.TitleArea.IsBold = True
    
    chart.PrimaryValueAxis.HasMajorGridLines = False
    
    # 系列设置
    for series in chart.Series:
        series.Format.Options.IsVaryColor = True
        series.Format.Options.GapWidth = 270
        series.DataPoints.DefaultDataPoint.DataLabels.HasValue = True
        series.DataPoints.DefaultDataPoint.DataLabels.Position = DataLabelPositionType.Inside


# 辅助函数:条形图配置
def bar_config(chart, title_x, title_y, min_val):
    chart.SeriesDataFromRange = False
    
    # 坐标轴设置
    if title_x:
        chart.PrimaryCategoryAxis.Title = title_x
        chart.PrimaryCategoryAxis.Font.IsBold = True
        chart.PrimaryCategoryAxis.TitleArea.IsBold = True
        chart.PrimaryCategoryAxis.TitleArea.TextRotationAngle = 90
    
    if title_y:
        chart.PrimaryValueAxis.Title = title_y
        chart.PrimaryValueAxis.TitleArea.IsBold = True
    
    chart.PrimaryValueAxis.HasMajorGridLines = False
    chart.PrimaryValueAxis.MinValue = min_val
    
    # 系列设置
    for series in chart.Series:
        series.Format.Options.IsVaryColor = True
        series.DataPoints.DefaultDataPoint.DataLabels.HasValue = True


# 示例使用
if __name__ == "__main__":
    # 配置参数
    configs = [
        {
            "in": "Microsoft Excel 工作表 1.xlsx",
            "out": "标准雷达图.xlsx",
            "type": ExcelChartType.Radar,
            "range": "A2:D8",
            "title": "某公司员工培训成绩图",
            "size": 18,
            "x": "",
            "y": "",
            "legend": LegendPositionType.Corner
        },
        {
            "in": "Microsoft Excel 工作表 1.xlsx",
            "out": "填充雷达图.xlsx",
            "type": ExcelChartType.RadarFilled,
            "range": "A2:D8",
            "title": "某公司员工培训成绩图",
            "size": 18,
            "x": "",
            "y": "",
            "legend": LegendPositionType.Corner
        },
        {
            "in": "Microsoft Excel 工作表 2.xlsx",
            "out": "简单折线图.xlsx",
            "type": ExcelChartType.Line,
            "range": "A2:E8",
            "title": "某公司年度各地市销售情况表(万元)",
            "size": 16,
            "x": "季度",
            "y": "销售额(万元)",
            "legend": LegendPositionType.Right
        },
        {
            "in": "Microsoft Excel 工作表 2.xlsx",
            "out": "堆积折线图.xlsx",
            "type": ExcelChartType.LineStacked,
            "range": "A2:E8",
            "title": "某公司年度各地市销售情况表(万元)",
            "size": 16,
            "x": "季度",
            "y": "销售额(万元)",
            "legend": LegendPositionType.Right
        },
        {
            "in": "Microsoft Excel 工作表.xlsx",
            "out": "簇状柱形图.xlsx",
            "type": ExcelChartType.ColumnClustered,
            "range": "A1:D6",
            "title": "儿童网络书店图书销售情况图",
            "size": 18,
            "x": "图书类别",
            "y": "销售额",
            "legend": LegendPositionType.Right
        },
        {
            "in": "Microsoft Excel 工作表.xlsx",
            "out": "堆叠柱形图.xlsx",
            "type": ExcelChartType.ColumnStacked,
            "range": "A1:D6",
            "title": "儿童网络书店图书销售情况图",
            "size": 18,
            "x": "图书类别",
            "y": "销售额",
            "legend": LegendPositionType.Right
        },
        {
            "in": "Microsoft Excel 工作表.xlsx",
            "out": "簇状条形图.xlsx",
            "type": ExcelChartType.BarClustered,
            "range": "A1:D6",
            "title": "儿童网络书店图书销售情况图",
            "size": 18,
            "x": "图书类别",
            "y": "销售额",
            "legend": LegendPositionType.Right
        },
        {
            "in": "Microsoft Excel 工作表.xlsx",
            "out": "堆叠条形图.xlsx",
            "type": ExcelChartType.BarStacked,
            "range": "A1:D6",
            "title": "儿童网络书店图书销售情况图",
            "size": 18,
            "x": "图书类别",
            "y": "销售额",
            "legend": LegendPositionType.Right
        }
    ]

    # 批量创建图表
    for cfg in configs:
        AddExcelChart(
            FileNameIn=cfg["in"],
            FileNameOut=cfg["out"],
            ChartType=cfg["type"],
            DataRange=cfg["range"],
            Title=cfg["title"],
            TitleSize=cfg["size"],
            TitleX=cfg["x"],
            TitleY=cfg["y"],
            Legend=cfg["legend"]
        )

本段中我们定义了一个函数 AddExcelChart,可以在Excel工作表中自动创建和配置各种类型图表。

雷达图
折线图
柱形图
开始
创建工作簿对象
加载输入Excel文件
获取第一个工作表
添加指定类型图表
设置数据范围
设置图表位置
设置图表标题样式
图表类型判断
配置雷达图属性
调用axis_config函数
设置坐标轴/网格线/数据标签
调用column_config函数
设置坐标轴/间隙宽度/数据标签
调用bar_config函数
设置坐标轴/最小值/数据标签
设置图例位置
保存到输出文件
释放工作簿资源
结束
条形图配置
调用bar_config函数
设置坐标轴/最小值/数据标签
设置分类轴标题和旋转
设置数值轴标题
隐藏网格线
设置最小值和数据标签
柱形图配置
调用column_config函数
设置坐标轴/间隙宽度/数据标签
设置分类轴标题
设置数值轴标题
隐藏网格线
设置间隙宽度和内部数据标签
雷达图配置
关闭序列范围标志
雷达图配置
隐藏绘图区填充
折线图配置
调用axis_config函数
设置坐标轴/网格线/数据标签
设置分类轴标题
设置数值轴标题
隐藏网格线
设置最小值
设置系列颜色和数据标签

该函数简化了使用 Spire.XLS 库创建专业图表的过程,适合批量生成多种类型的图表。
在实际使用的时候可以根据需要,将函数参数进行修改,来生成所需的图表。

调用函数自动生成的八个带图表的文件

结语

本文通过实战案例展示了如何使用 Spire.XLS for Python 创建专业级雷达图和折线图:

最佳实践建议

  • 数据准备:确保数据清洁,结构清晰(类别在前,数值在后)
  • 颜色选择:使用对比明显的颜色方案,提高可读性
  • 标签策略:重要数据点添加标签,避免图表过度拥挤
  • 自动化:结合 Spire.XLS 库其他功能,封装图表创建函数,实现一键规模化生成报表

Spire.XLS for Python 不仅支持雷达图和折线图,还支持创建饼图、散点图、直方图等30+种图表类型,满足各种数据可视化需求。

通过本教程,我们可以将数据可视化效率提升数倍,将更多时间投入数据分析与决策,而非繁琐的图表制作过程。立即应用这些技术,让你的数据报告更加专业、直观!

如需了解更多高级功能或在实际应用中遇到问题,请访问 Spire.XLS for Python 中文教程 获取详细指导和技术支持。


拓展学习:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值