Python-openpyxl教程6 - 图表之面积图和条形图

前文:
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表格
SampleChart

默认情况下图表的左上角固定在单元格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"表格
SampleArea

您还可以创建三维面积图

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"表格

这将生成一个简单的三维面积图,其中第三个轴可用于替换图例:

SampleArea3D

实测使用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')

这将产生四个图表,说明各种可能性。


image.png

#####

您还可以创建三维条形图

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")

这将生成一个简单的三维条形图。

bar3d

实测使用WPS不支持该方法创建三维条形图

note:有兴趣的小伙伴可以帮忙看下在 office下的现象


来源: https://openpyxl.readthedocs.io/en/stable/charts/introduction.html

你可能感兴趣的:(Python-openpyxl教程6 - 图表之面积图和条形图)