用Python让Excel飞起来——绘图

上次我们讨论利用openpyxl来修改Excel的格式,这次我们看看如何使用openpyxl来进行Excel的图表绘制。图表是Excel数据展现和数据分析的一个很重要的内容,我们同样可以使用openpyxl来实现对Excel的自动化绘图。openpyxl支持根据工作表中的数据,绘制条线图、折线图、散点图和饼图等等,包括三维图表,几乎囊括了Excel中的各种图表。
要用openpyxl创建图表,需要使用以下步骤:

  1. 创建一个Reference对象,指定矩形数据选择区域的最小列和最大列,最小行和最大行;
  2. 通过传入的Reference对象,创建一个Series对象;
  3. 创建一个Chart对象;
  4. 将Series对象添加到Chart对象;
  5. 设置Chart对象的位置,包括距离工作表左边沿和上边沿的距离,以及Chart对象的长和宽;
  6. 将Chart对象添加到Worksheet对象。
    下面看一个简单的示例:
import openpyxl

wb = openpyxl.Workbook()
sheet = wb.get_active_sheet()
for i in range(1, 11):
    sheet['A'+str(i)] = i ## 赋值

refObj = openpyxl.chart.Reference(sheet, min_col=1, min_row=1, max_row=10)

seriesObj = openpyxl.chart.Series(refObj, title='First series')

chartObj = openpyxl.chart.BarChart()
chartObj.append(seriesObj)

sheet.add_chart(chartObj, "E1")
wb.save('sampleChart.xlsx')

该程序先在工作表sheet中的A1到A10赋值,然后选择了第一列(也就是A列),从第一行到第十行的区域作为Reference对象,提供数据,并构建Series对象,然后创建一个柱状图对象chartObj,将Series对象seriesObj添加到chartObj中。最后设置chartObj在sheet的显示位置,这里是从E1单元格开始显示,保存为一个新的Excel文件。执行结果如下:


绘图

可以看到,已经生成了绘图。
接下来,我们来看看一些具体参数的设置。构建一个Chart对象后,可以设置chart对象的title属性,代表图表标题,设置chart.x_axis.title代表X轴的标题,同样的,设置chart.y_axis.title代表Y轴的标题,chart.legend代表显示的图例。另外,chart.x_axis.scaling.min代表X轴的最小刻度,chart.x_axis.scaling.max代表X轴的最大刻度,chart.y_axis.scaling.min代表Y轴的最小刻度,chart.y_axis.scaling.max代表Y轴的最大刻度。代码如下:

from openpyxl import Workbook
from openpyxl.chart import BarChart, Reference, Series

wb = Workbook()
ws = wb.active
for i in range(10):
    ws.append([i])
    
values = Reference(ws, min_col=1, min_row=1, max_col=1, max_row=10)
chart = BarChart()
chart.title = "Full Axes" ## 图标标题
chart.x_axis.title = 'x'  ## X轴名称
chart.y_axis.title = 'score' ## Y轴名称
chart.legend = None ## 不显示图例
#chart.legend.position = 'r'

chart.x_axis.scaling.min = 0 ## 设置X轴的最小刻度
chart.y_axis.scaling.min = 0 ## 设置Y轴测最小刻度
chart.x_axis.scaling.max = 15 ## 设置X轴的最大刻度
chart.y_axis.scaling.max = 10 ## 设置Y轴的最大刻度

chart.add_data(values)
ws.add_chart(chart, "E15")
wb.save("SampleChart.xlsx")
绘图

可以看到,我们这次画图的位置在E15处,并且我们设置了X轴的最大刻度为15,而数据只有10个,因此右边5个刻度是空置的。

最后,我们来试着把我们之前的平均分Excel可视化一下。这次我打算用柱状图来展现几位同学的平均分,并且采用三维柱状图更直观的来展现。代码如下:

import openpyxl
from openpyxl import Workbook
from openpyxl.chart import (
    LineChart,
    BarChart3D,
    Reference,
    Series,
)

wb = openpyxl.load_workbook('D:/Book5.xlsx')
sheet = wb.get_active_sheet()
data = Reference(sheet, min_col=6, min_row=2, max_col=6, max_row=10)
names = Reference(sheet, min_col=1, min_row=2, max_col=1, max_row=10)

seriesObj = openpyxl.chart.Series(names, title='学生姓名')

c1 = BarChart3D()
c1.x_axis.title = '学生姓名'
c1.y_axis.title = '平均分'
c1.y_axis.majorGridlines = None
c1.title = '平均分柱状图'
c1.add_data(data)
c1.legend = None ## 不显示图例
c1.set_categories(names)

sheet.add_chart(c1, "F12")
wb.save("avg.xlsx")

下面,我们来具体说明一下程序。首先我们引入了需要的包,由于我打算绘制三维柱状图,因此需要导入BarChart3D类,该类负责绘制三维的柱状图。接下,读取我们之前格式化后的平均分Excel,并选取第六列,从第2行到第10行的数据(就是平均分)作为图表的展现数据,选取第一列,从第2行到第10行的数据,也就是学生的姓名,分别作为两个Reference。
接下来,构建一个BarChart3D对象,设置图像的标题,和X轴名字和Y轴名字。对图表调用add_data方法加入平均分Reference,调用set_categories方法加入名称Reference。最后设置图表放在sheet的F12单元格处,最后把workbook保存为avg.xlsx。

展示结果

可以看到展示的结果符合我们的要求。其实图表的功能有很多,现在百度的echarts.js非常流行,甚至有对应的Python版pyecharts,plotnine等等绘图包,效果都很不错。至于利用openpyxl包画图,可以参考官方文档:
https://openpyxl.readthedocs.io/en/stable/charts/introduction.html
可以关注我的微信公众号“小晖程序”。

你可能感兴趣的:(用Python让Excel飞起来——绘图)