用Python绘制折线图(上)

各个事业部需要在工作表中生成利润走势图,来分析利润走向。

但是一共有52个部门,也就是需要给52个Excel表格绘图,同样的绘图操作要重复52遍,如果一个个操作实在浪费时间。

还有绘制什么样式的图也需要琢磨一下。既然是分析利润的走势,那么选择折线图就可以更好地展示数据的变化趋势。

代码实现:
 

import os
from openpyxl import load_workbook
from openpyxl.chart import LineChart, Reference

# 设置目标文件夹路径
path = './各部门利润表汇总/'

# 获取文件夹下的所有文件名
file_list = os.listdir(path)
# 遍历文件名列表,取得每一个文件名
for file_name in file_list:
    # 拼接文件路径
    file_path = path + file_name
    print('正在处理:' + file_name)
    # 读取工作簿
    wb = load_workbook(file_path)
    # 读取工作簿中的活跃工作表
    ws = wb.active
  
    # 实例化 LineChart 类,得到 LineChart 对象
    chart = LineChart()
    # 引用工作表的部分数据
    data = Reference(worksheet=ws, min_row=3, max_row=9, min_col=1, max_col=5)
    # 添加被引用的数据到 LineChart 对象
    chart.add_data(data, from_rows=True, titles_from_data=True)
    # 添加 LineChart 对象到工作表中,指定折线图的位置
    ws.add_chart(chart, "C12")

    # 引用工作表的表头数据
    cats = Reference(worksheet=ws, min_row=2, max_row=2, min_col=2, max_col=5)
    # 设置类别轴的标签
    chart.set_categories(cats)
    # 设置 x 轴的标题
    chart.x_axis.title = "季度"
    # 设置 y 轴的标题
    chart.y_axis.title = "利润"
    # 改变线条颜色
    chart.style = 48

    # 保存文件
    wb.save(file_path)
# 在终端提示表格绘图结束
print('恭喜你,工作表中的图绘制成功!')

运行效果:

用Python绘制折线图(上)_第1张图片

功能拆解

在分析项目、功能拆解前,先认识一下Excel图的元素。

X、Y轴的标题:图的坐标轴分为X轴(水平轴)、Y轴(垂直轴),其标题说明了坐标轴的内容。如下图所示:

用Python绘制折线图(上)_第2张图片

 

类别轴、值轴:坐标轴还可以分为类别轴和值轴。值轴用于描述数量,标签一般是数字;类别轴用于描述类别,标签一般为类别名,如下图的“第n季度”。

用Python绘制折线图(上)_第3张图片

图例:说明图中数据系列的含义。在下图中,图例说明相应颜色折线的含义,比如:深褐色折线描述了项目A的利润变化。

简单了解Excel图的元素后,我们开始项目的分析和拆解。

先回顾一下如何使用Microsoft Excel为多个Excel文件绘制折线图。

首先,打开一个Excel文件,绘制利润走势折线图,过程分为两步:
一、折线图绘制
二、折线图信息及样式的优化

用Python绘制折线图(上)_第4张图片

其中,折线图绘制包括三个步骤:确认图的类型引用表格的数据设置图在工作表的位置

用Python绘制折线图(上)_第5张图片 

折线图信息及样式的优化包括三个步骤:修改类别轴的标签添加X轴、Y轴的标题修改图的样式

用Python绘制折线图(上)_第6张图片 

最后,依次打开其他Excel文件,重复实现折线图绘制折线图信息及样式的优化

其实,利用Python绘制折线图时,也对应着这两步:折线图绘制折线图信息及样式的优化

由此,该项目可以拆解为四大功能块:循环打开Excel文件折线图绘制折线图信息及样式的优化保存Excel文件

 用Python绘制折线图(上)_第7张图片

项目的关键问题在于:LineChart对象Reference对象的学习,实现折线图绘制折线图信息及样式的优化

然后,结合已学的知识for循环os.listdir()完成循环打开Excel文件工作簿对象.save()完成保存Excel文件

最后,将四个功能块合并,就可以为52个事业部的Excel表格绘制折线图。

2. 折线图绘制

折线图绘制功能块包括三个步骤:确定图的类型引用表格中的数据设置图在工作表的位置

接下来,我会讲解各步骤相关的知识点。最后,利用所学知识实现折线图绘制功能块。

用Python绘制折线图(上)_第8张图片

 

确定图的类型

LineChart类

openpyxl 可以绘制条形图、折线图等图。在openpyxl.chart模块中,每个类型的图都有对应的类。

通过chart = LineChart(),得到LineChart对象(LineChart的意思是:折线图),相当于确认图的类型为折线图。

同理,通过chart = BarChart()可以得到BarChart对象(BarChart的意思是:条形图)。

综上,LineChart对象BarChart对象都可以称为图表对象。

需要注意的是,在实例化LineChart类前,不要忘了从openpyxl.chart中导入LineChart

引用表格中的数据

这个步骤的实现,需要讲解较多的新知识:Reference类LineChart对象.add_data()

Reference 类

在Python中,通过实例化openpyxl.chart中的Reference类(Reference中文翻译为:引用),完成表格数据的引用。

例如:Reference(worksheet=ws, min_row=3, max_row=9, min_col=1, max_col=5)引用了工作表对象ws中第3行到第9行、第1列到第5列矩形区域的数据。

用Python绘制折线图(上)_第9张图片

Reference 类中的各参数代表什么意思?

参数worksheet比较好理解,指明被引用数据所在的工作表对象。

参数min_rowmax_rowmin_colmax_col:指明被引用数据的区域。

其中,min_row指明数据区域的起始行,max_row、min_col、max_col指明终止行、起始列、终止列。如下图所示。
【温馨提示】区域包括起始行、终止行、起始列、终止列

用Python绘制折线图(上)_第10张图片

 通过实例化Reference类,引用“事业01部.xlsx”第 3 行的数据。

用Python绘制折线图(上)_第11张图片

 实现代码:

from openpyxl import load_workbook
from openpyxl.chart import Reference, LineChart
# 读取工作簿
wb = load_workbook('./事业01部.xlsx')
# 读取工作簿中的活跃工作表
ws = wb.active
# 实例化 LineChart 类
chart = LineChart()
# 实例化Reference类,创建Reference对象,赋值给变量data。引用第3行的数据。
data = Reference(worksheet=ws, min_row=3, max_row=3, min_col=1, max_col=6)

当取一行数据时,起始行和终止行是同一行。

LineChart对象.add_data()

通过实例化Reference类引用表格的数据后,还需要把被引用的数据添加到LineChart对象

这时, LineChart对象.add_data()方法派上用场了。

例如,Linechart对象.add_data(data, from_rows=True, titles_from_data=True),将被引用的数据data添加到LineChart对象中。

 

第一个参数是被引用的数据,它是Reference对象

参数from_rows,参数titles_from_data又是什么意思呢?

参数from_rows的值可以是TrueFalse,默认值是False。我们尝试给参数from_rows设置不同的值理解该参数的意义。

数from_rows小结:

一、from_rows(中文翻译为:来自行)。当from_rows设置为True时,引用区域的每行数据绘制一条折线。

用Python绘制折线图(上)_第12张图片

二、当from_rows设置为False时,引用区域的每列数据绘制一条折线。

用Python绘制折线图(上)_第13张图片 

参数titles_from_data的值也只能是TrueFalse,默认值是False。当设置不同的值,折线图会是怎么样的呢?

所以,当titles_from_data = False时,只需要引用绘制折线的数据

titles_from_data = True时,则需要多引用表格的数据来命名图例。

如下图中,多引用了表格的A列:项目A、项目B、项目C来命名图例。

用Python绘制折线图(上)_第14张图片

引用表格中的数据步骤涉及的知识已讲解完:

1)Reference类:Reference(worksheet, min_row, max_row, min_col, max_col)
2)add_data()方法:LineChart对象.add_data(Reference对象,from_rows, titles_from_data)

了解了如何去引用数据来绘制折线图后,还需要确定好折线图在表格中放置的位置。

添图至表格的合适位置

工作表对象.add_chart()

绘制完图后,需要使用方法工作表对象.add_chart()将图添加至工作表,并设置图的位置。

add_chart()的使用很简单:工作表对象.add_chart(图表对象,参数anchor)

第1个参数,指明被添加至工作表的图表对象,这里是LineChart对象。

第2个参数 anchor:设置图在工作表的位置。

例如,ws.add_chart(chart, "C12"),将绘制后的图表对象chart添加到工作表对象ws中,图的左上角位于单元格C12

用Python绘制折线图(上)_第15张图片

至此,我们已经可以在工作表上引用数据绘制出一个折线图,并放置在工作表的固定位置了。也就实现了功能块2:折线图绘制

用Python绘制折线图(上)_第16张图片

练习绘制折线图:

绘制项目A~项目G的利润变化,需要以项目名命名图例。

用Python绘制折线图(上)_第17张图片 

涉及到的知识点有:

用Python绘制折线图(上)_第18张图片 

 

 实现代码:

from openpyxl import load_workbook
from openpyxl.chart import LineChart, Reference

# 读取工作簿
wb = load_workbook('./事业01部.xlsx')
# 读取工作簿中的活跃工作表
ws = wb.active
# 实例化 LineChart 类,得到 LineChart 对象, 并赋值给变量chart
chart=LineChart()
# 实例化 Reference 类,引用工作表的部分数据。将Reference对象赋值给变量data
data=Reference(worksheet=ws,min_row=3,max_row=9,min_col=1,max_col=5)
# 添加被引用的数据到 LineChart 对象
chart.add_data(data,from_rows=True, titles_from_data=True)
# 添加 LineChart 对象到工作表中,折线图的左上角位于单元格 C12。
ws.add_chart(chart,'C12')

# 保存文件
wb.save('./事业01部.xlsx')

 运行效果:

用Python绘制折线图(上)_第19张图片

 

 

 

 

你可能感兴趣的:(Python,python,开发语言,后端,折线图,Excel)