使用 openpyxl 生成 Excel 面积图

面积图可以强调数量随着时间发生变化的程度,还可以引起人们对总值趋势的关注。例如,表示随时间而变化的销售数据就可以用面积图来表示,用来强调销售额。

1 2D 面积图

'''
2D 面积图
@author Deniro Li
'''
from openpyxl import Workbook
from openpyxl.chart import AreaChart, Reference
from random import randint

wb = Workbook()
ws = wb.active

# 随机生成销售额数据
rows = [
    ['1 月', '北京', '上海'],
]
for i in range(2, 14):
    rows.append([str(i) + ' 月', randint(10, 90), randint(5, 50)])
for row in rows:
    ws.append(row)

# 初始化 AreaChart 对象
chart = AreaChart()
chart.title = "区域销售额"
chart.style = 10
chart.x_axis.title = '2019 年'
chart.y_axis.title = '单位(百万)'

# 计算类别与数据的最大行数
max_row = len(rows)
# 计算数据的最大列数
max_col = len(rows[1])

# 类别对象
cats = Reference(ws, min_col=1, min_row=1, max_row=max_row)
chart.set_categories(cats)

# 数据对象
data = Reference(ws, min_col=2, min_row=1, max_col=max_col, max_row=max_row)
chart.add_data(data, titles_from_data=True)

# 放入 Workbook 对象并指定初始位置
ws.add_chart(chart, 'E5')

wb.save('area_2d.xlsx')

运行结果:

  • 示例通过随机函数来生成不同区域的销售额数据。
  • 注意: 横坐标是月份,但每一月所对应的数据却在下一行!

(1)新建 AreaChart 对象,并初始化各项参数

可以通过 AreaChart 类来建立 2D 面积图对象。它有以下属性:

属性 说明
title 图标标题
style 图表样式编号
x_axis.title 横坐标标题
y_axis.title 纵坐标标题

其中的样式编号所对应的就是 Excel “设计” 标签所对应的图表样式中的某个样式编号:

(2)新建类别对象

AreaChart#set_categories 方法用于设置类别区域对象(即 Reference 对象),这个示例中的类别区域指的是下图中的绿框处:

(3)新建数据对象

AreaChart#add_data 方法用于设置数据区域对象(即 Reference 对象),这个示例中的数据区域指的是下图中的黑框处:

注意: 因为第 13 行第 A 列的值没有用到,所以真实使用时,可以不必填值。

AreaChart#add_data 方法有一个 titles_from_data 属性,表示是否从类别对象获取名称。在本示例中,即是“北京”与“上海”:

(4)放入 Workbook 对象并指定初始位置

Workbook#add_chart 的第二个属性即表示图标在 Excel 左上角初始位置。

2 3D 面积图

我们也可以把刚才的示例转化为 3D 形式。核心代码如下:

...
from openpyxl.chart import AreaChart3D
...
# 初始化 AreaChart3D 对象
chart=AreaChart3D()
chart.style=10
chart.x_axis.title = '2019 年'
chart.y_axis.title = '单位(百万)'
chart.legend=None
chart.height=10
chart.width=30

# 类别对象
cats = Reference(ws, min_col=1, min_row=1, max_row=max_row)
chart.set_categories(cats)

# 数据对象
data = Reference(ws, min_col=2, min_row=1, max_col=max_col, max_row=max_row)
chart.add_data(data, titles_from_data=True)

# 放入 Workbook 对象并指定初始位置
ws.add_chart(chart, 'E5')
...

运行结果:

  • 生成步骤与 2D 面积图类似,也是初始化面积图对象、类别对象以及数据对象,最后放入 Workbook 对象并指定初始位置。
  • 示例中的不同点在于,我们为 AreaChart3D 多设置了一些属性。
属性 说明
legend 图表颜色区域说明。在本示例中指的就是区域,即 “北京”、“上海”。因为已经是三维图了,所以这里没必要再重复展示(设置为 None)。
height 图表高度,默认为 7.5cm。
width 图标宽度,默认为 15cm。

本示例中,将其设置的更大一些。

生成的 3D 图表可能显示的不完全,有的数据被遮挡住了,这时,可以利用 Excel 的三维旋转功能,让图表按照我们所希望的角度进行展示:

发表评论