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行\color {skyblue} {实测8x14})。可以通过设置图标的anchor,width和height属性来更改此设置。实际大小将取决于操作系统和设备。
其他锚点是可能的。请参考openpyxl.drawing.spreadsheet_drawing 来获取更多信息。

面积图

\color {skyblue} {二维面积图}

面积图类似于折线图,不同之处在于填充了绘制线下方的区域。通过将分组设置为"标准","堆叠"或"百分比堆叠",可以使用不同的变体。默认为"标准"。

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
\color {skyblue} {三维面积图}

您还可以创建三维面积图

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不支持该方法创建三维面积图

条形图和柱形图

在条形图中,值被绘制为水平条或垂直列

\color {skyblue} {垂直,水平和堆叠条形图}
\color {skyblue} {!笔记}
以下设置会影响不同的图表类型。
通过分别将类型设置为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

##### \color {skyblue} {三维条形图}

您还可以创建三维条形图

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,686评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,668评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,160评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,736评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,847评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,043评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,129评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,872评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,318评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,645评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,777评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,861评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,589评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,687评论 2 351

推荐阅读更多精彩内容