前文:
Python-openpyxl教程1 - openpyxl简介
Python-openpyxl教程2 - 简单使用
Python-openpyxl教程3 - 读写性能
Python-openpyxl教程4 - 优化模式
Python-openpyxl教程5 - 与Pandas交互
图表类型
openpyxl可以使用以下图表:
- 面积图
- 二维面积图
- 三维面积图
- 条形图和柱状图
- 垂直,水平和堆叠条形图
- 三维条形图
- 气泡图
- 折线图
- 折线图
- 三维折线图
- 散点图
- 饼图
- 饼图
- 投影饼图
- 三维饼图
- 渐变饼图
- 甜甜圈图
- 雷达图
- 股票图
- 曲面图
创建图表
图表至少由一系列一个或多个数据点组成。系列本身对单元格范围的引用组成。
from openpyxl import Workbook
from openpyxl.chart import BarChart, Reference
wb = Workbook()
ws = wb.active
for i in range(10):
ws.append([i]) # 添加一行值
# Reference:标准化单元格范围引用 Normalise cell range references
values = Reference(ws, min_col=1, min_row=1, max_col=1, max_row=10) # 引用ws工作表范围[A1:A10]
chart = BarChart() # 新建一个条形图对象
chart.add_data(values) # 给单个过程添加一系列值"values",默认是将每一列作为一系列值
ws.add_chart(chart, 'E15') # 将条形图添加到E15单元格位置
wb.save("SampleChart.xlsx") # 保存为SampleChart.xlsx表格
默认情况下图表的左上角固定在单元格E15上,大小为15x7.5厘米(大约5列乘14行)。可以通过设置图标的anchor,width和height属性来更改此设置。实际大小将取决于操作系统和设备。
其他锚点是可能的。请参考openpyxl.drawing.spreadsheet_drawing
来获取更多信息。
面积图
面积图类似于折线图,不同之处在于填充了绘制线下方的区域。通过将分组设置为"标准","堆叠"或"百分比堆叠",可以使用不同的变体。默认为"标准"。
from openpyxl import Workbook
from openpyxl.chart import AreaChart, Reference
wb = Workbook()
ws = wb.active
rows = [
['Number', 'Batch 1', 'Batch 2'],
[2, 40, 30],
[3, 40, 25],
[4, 50, 30],
[5, 30, 10],
[6, 25, 5],
[7, 50, 10],
]
# 添加数据
for row in rows:
ws.append(row)
chart = AreaChart() # 创建一个面积图对象
chart.title = 'Area Chart' # 面积图对象标题赋值
chart.style = 13 # 面积图对象风格
chart.x_axis.title = 'Test' # x轴标题
chart.y_axis.title = 'Percentage' # y轴标题
cats = Reference(ws, min_col=1, min_row=1, max_row=7) # 创建一个名为cats的引用对象
# cats = Reference(ws, min_col=1, min_row=2, max_row=7)
data = Reference(ws, min_col=2, min_row=1, max_col=3, max_row=7) # 创建一个名为data的引用对象
chart.add_data(data, titles_from_data=True) # 面积图添加数据
chart.set_categories(cats) # 面积图设置类别(便于理解类别的作用,可以将cats注释行给取消注释)
ws.add_chart(chart, 'A10') # 将面积图添加并且固定在A10单元格位置
wb.save('SampleArea.xlsx') # 保存为"SampleArea.xlsx"表格
您还可以创建三维面积图
from openpyxl import Workbook
from openpyxl.chart import AreaChart3D, Reference
wb = Workbook()
ws = wb.active
rows = [
['Number', 'Batch 1', 'Batch 2'],
[2, 30, 40],
[3, 25, 40],
[4, 30, 50],
[5, 10, 30],
[6, 5, 25],
[7, 10, 50],
]
# 添加数据
for row in rows:
ws.append(row)
chart = AreaChart3D() # 创建一个面积图对象
chart.title = 'Area Chart' # 面积图对象标题赋值
chart.style = 13 # 面积图对象风格
chart.x_axis.title = 'Test' # x轴标题
chart.y_axis.title = 'Percentage' # y轴标题
chart.legend = None
cats = Reference(ws, min_col=1, min_row=1, max_row=7) # 创建一个名为cats的引用对象
# cats = Reference(ws, min_col=1, min_row=2, max_row=7)
data = Reference(ws, min_col=2, min_row=1, max_col=3, max_row=7) # 创建一个名为data的引用对象
chart.add_data(data, titles_from_data=True) # 面积图添加数据
chart.set_categories(cats) # 面积图设置类别(便于理解类别的作用,可以将cats注释行给取消注释)
ws.add_chart(chart, 'A10') # 将面积图添加并且固定在A10单元格位置
wb.save('SampleArea3D.xlsx') # 保存为"SampleArea.xlsx"表格
这将生成一个简单的三维面积图,其中第三个轴可用于替换图例:
实测使用WPS不支持该方法创建三维面积图
条形图和柱形图
在条形图中,值被绘制为水平条或垂直列
以下设置会影响不同的图表类型。 |
通过分别将类型设置为col或bar, 在垂直和水平条形图之间切换。 |
使用堆叠图表时,重叠部分需要设置为100。 |
如果条是水平的,则x和y轴将反转。 |
from copy import deepcopy
from openpyxl import Workbook
from openpyxl.chart import BarChart, Reference
wb = Workbook(write_only=True)
ws = wb.create_sheet()
rows = [
('Number', 'Batch 1', 'Batch 2'),
(2, 10, 30),
(3, 40, 60),
(4, 50, 70),
(5, 20, 10),
(6, 10, 40),
(7, 50, 30),
]
for row in rows:
ws.append(row)
chart1 = BarChart() # 新建一个条形图
chart1.type = 'col' # 暂不知道该参数的解释,从实际表现上来看type决定了以垂直还是水平条形图来显示。['col':'垂直', 'bar':'水平']
chart1.style = 10 # 图表的风格设置为10
chart1.title = 'Bar Chart' # 设置图表的标题
chart1.y_axis.title = 'Test number' # 设置图标的x轴标签
chart1.x_axis.title = 'Sample length(mm)' # 设置图表的y轴标签
data = Reference(ws, min_col=2, min_row=1, max_row=7, max_col=3) # 创建一个Reference对象[B1:C7]
cats = Reference(ws, min_col=1, min_row=2, max_row=7) # 创建一个Reference对象[A2:A7]
chart1.add_data(data, titles_from_data=True) # 添加数据,并且从数据中获取标题
chart1.set_categories(cats) # 设置类型为cats.
chart1.shape = 4 # 暂未从表现中看出有什么实际作用
ws.add_chart(chart1, 'A10') # 垂直条形图
chart2 = deepcopy(chart1) # 重新创建一个图表深拷贝chart1
chart2.style = 11
chart2.type = 'bar'
chart2.title = 'Horizontal Bar Chart'
ws.add_chart(chart2, 'I10') # 水平条形图
chart3 = deepcopy(chart1)
chart3.type = 'col'
chart3.style = 12
chart3.grouping = 'stacked'
chart3.overlap = 100
chart3.title = 'Stacked Chart'
ws.add_chart(chart3, 'A27') # 堆叠垂直条形图
chart4 = deepcopy(chart1)
chart4.type = 'bar'
chart4.style = 13
chart4.grouping = 'percentStacked'
chart4.overlap = 100
chart4.title = 'Percent Stacked Chart'
ws.add_chart(chart4, 'I27') # 堆叠水平百分比条形图
wb.save('SampleBar2.xlsx')
这将产生四个图表,说明各种可能性。
#####
您还可以创建三维条形图
from openpyxl import Workbook
from openpyxl.chart import (
Reference,
Series,
BarChart3D,
)
wb = Workbook()
ws = wb.active
rows = [
(None, 2013, 2014),
("Apples", 5, 4),
("Oranges", 6, 2),
("Pears", 8, 3)
]
for row in rows:
ws.append(row)
data = Reference(ws, min_col=2, min_row=1, max_col=3, max_row=4)
titles = Reference(ws, min_col=1, min_row=2, max_row=4)
chart = BarChart3D()
chart.title = "3D Bar Chart"
chart.add_data(data=data, titles_from_data=True)
chart.set_categories(titles)
ws.add_chart(chart, "E5")
wb.save("bar3d.xlsx")
这将生成一个简单的三维条形图。
实测使用WPS不支持该方法创建三维条形图
note:有兴趣的小伙伴可以帮忙看下在 office下的现象
来源: https://openpyxl.readthedocs.io/en/stable/charts/introduction.html