在日常工作中,我们经常有着这样的场景需求:
- 需要对比多个产品在多个维度(如性能、价格、用户体验)的表现
- 分析销售数据随时间变化的趋势,识别峰值和低谷
- 展示员工能力评估结果,直观呈现各维度得分
- 追踪项目进度,可视化各阶段完成情况
面对错综繁杂的海量数据时,光靠眼睛看一个个单元格是效率极低的。因此,我们需要一种高效的方法来处理这些数据:图表是 Excel 中强大的数据可视化工具,而 Spire.XLS for Python 库提供了便捷的图表创建功能,让开发者能够仅用几行代码就创建各种如柱形图、条形图、雷达图、折线图等的专业图表。这次就让我们来学习,如何使用 Spire.XLS 创建雷达图和折线图。
前期准备
Spire.XLS for Python 库是本教程的中心,它提供的 API 允许我们在 Python 中对 Excel 文件进行各类操作,同时不依赖于外部软件,如 Microsoft Excel。
你可以通过以下 pip 命令将它们轻松安装到 Windows 中。或者通过 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 自动生成标准雷达图)
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工作表中自动创建和配置各种类型图表。
(函数 AddExcelChart 处理逻辑的主要流程图)
(函数 AddExcelChart 处理逻辑的子流程图)
该函数简化了使用 Spire.XLS 库创建专业图表的过程,适合批量生成多种类型的图表。 在实际使用的时候可以根据需要,将函数参数进行修改,来生成所需的图表。
结语
本文通过实战案例展示了如何使用 Spire.XLS for Python 创建专业级雷达图和折线图:
最佳实践建议:
- 数据准备:确保数据清洁,结构清晰(类别在前,数值在后)
- 颜色选择:使用对比明显的颜色方案,提高可读性
- 标签策略:重要数据点添加标签,避免图表过度拥挤
- 自动化:结合 Spire.XLS 库其他功能,封装图表创建函数,实现一键规模化生成报表
Spire.XLS for Python 不仅支持雷达图和折线图,还支持创建饼图、散点图、直方图等30+种图表类型,满足各种数据可视化需求。
通过本教程,我们可以将数据可视化效率提升数倍,将更多时间投入数据分析与决策,而非繁琐的图表制作过程。立即应用这些技术,让你的数据报告更加专业、直观!
如需了解更多高级功能或在实际应用中遇到问题,请访问我们的主页或 Spire.XLS for Python 中文教程 获取更多指导和技术支持。
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |