Python-openpyxl教程6 - 圖表之面積圖和條形圖

前文:
Python-openpyxl教程1 - openpyxl簡(jiǎn)介
Python-openpyxl教程2 - 簡(jiǎn)單使用
Python-openpyxl教程3 - 讀寫性能
Python-openpyxl教程4 - 優(yōu)化模式
Python-openpyxl教程5 - 與Pandas交互


圖表類型

openpyxl可以使用以下圖表:

  • 面積圖
    • 二維面積圖
    • 三維面積圖
  • 條形圖和柱狀圖
    • 垂直尿这,水平和堆疊條形圖
    • 三維條形圖
  • 氣泡圖
  • 折線圖
    • 折線圖
    • 三維折線圖
  • 散點(diǎn)圖
  • 餅圖
    • 餅圖
    • 投影餅圖
    • 三維餅圖
    • 漸變餅圖
  • 甜甜圈圖
  • 雷達(dá)圖
  • 股票圖
  • 曲面圖

創(chuàng)建圖表

圖表至少由一系列一個(gè)或多個(gè)數(shù)據(jù)點(diǎn)組成簇抵。系列本身對(duì)單元格范圍的引用組成。

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

wb = Workbook()
ws = wb.active

for i in range(10):
    ws.append([i])  # 添加一行值

# Reference:標(biāo)準(zhǔn)化單元格范圍引用 Normalise cell range references
values = Reference(ws, min_col=1, min_row=1, max_col=1, max_row=10)  # 引用ws工作表范圍[A1:A10]
chart = BarChart()  # 新建一個(gè)條形圖對(duì)象
chart.add_data(values)  # 給單個(gè)過程添加一系列值"values",默認(rèn)是將每一列作為一系列值
ws.add_chart(chart, 'E15')  # 將條形圖添加到E15單元格位置
wb.save("SampleChart.xlsx")  # 保存為SampleChart.xlsx表格
SampleChart

默認(rèn)情況下圖表的左上角固定在單元格E15上射众,大小為15x7.5厘米(大約5列乘14行\color {skyblue} {實(shí)測(cè)8x14})碟摆。可以通過設(shè)置圖標(biāo)的anchor叨橱,width和height屬性來更改此設(shè)置典蜕。實(shí)際大小將取決于操作系統(tǒng)和設(shè)備。
其他錨點(diǎn)是可能的罗洗。請(qǐng)參考openpyxl.drawing.spreadsheet_drawing 來獲取更多信息愉舔。

面積圖

\color {skyblue} {二維面積圖}

面積圖類似于折線圖,不同之處在于填充了繪制線下方的區(qū)域伙菜。通過將分組設(shè)置為"標(biāo)準(zhǔn)"轩缤,"堆疊"或"百分比堆疊",可以使用不同的變體贩绕。默認(rèn)為"標(biāo)準(zhǔn)"火的。

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],
]

# 添加數(shù)據(jù)
for row in rows:
    ws.append(row)

chart = AreaChart()  # 創(chuàng)建一個(gè)面積圖對(duì)象
chart.title = 'Area Chart'  # 面積圖對(duì)象標(biāo)題賦值
chart.style = 13  # 面積圖對(duì)象風(fēng)格
chart.x_axis.title = 'Test'  # x軸標(biāo)題
chart.y_axis.title = 'Percentage'  # y軸標(biāo)題


cats = Reference(ws, min_col=1, min_row=1, max_row=7)  # 創(chuàng)建一個(gè)名為cats的引用對(duì)象
# 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)  # 創(chuàng)建一個(gè)名為data的引用對(duì)象

chart.add_data(data, titles_from_data=True)  # 面積圖添加數(shù)據(jù)
chart.set_categories(cats)  # 面積圖設(shè)置類別(便于理解類別的作用,可以將cats注釋行給取消注釋)

ws.add_chart(chart, 'A10')  # 將面積圖添加并且固定在A10單元格位置

wb.save('SampleArea.xlsx')  # 保存為"SampleArea.xlsx"表格
SampleArea
\color {skyblue} {三維面積圖}

您還可以創(chuàng)建三維面積圖

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],
]

# 添加數(shù)據(jù)
for row in rows:
    ws.append(row)

chart = AreaChart3D()  # 創(chuàng)建一個(gè)面積圖對(duì)象
chart.title = 'Area Chart'  # 面積圖對(duì)象標(biāo)題賦值
chart.style = 13  # 面積圖對(duì)象風(fēng)格
chart.x_axis.title = 'Test'  # x軸標(biāo)題
chart.y_axis.title = 'Percentage'  # y軸標(biāo)題
chart.legend = None

cats = Reference(ws, min_col=1, min_row=1, max_row=7)  # 創(chuàng)建一個(gè)名為cats的引用對(duì)象
# 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)  # 創(chuàng)建一個(gè)名為data的引用對(duì)象

chart.add_data(data, titles_from_data=True)  # 面積圖添加數(shù)據(jù)
chart.set_categories(cats)  # 面積圖設(shè)置類別(便于理解類別的作用淑倾,可以將cats注釋行給取消注釋)

ws.add_chart(chart, 'A10')  # 將面積圖添加并且固定在A10單元格位置

wb.save('SampleArea3D.xlsx')  # 保存為"SampleArea.xlsx"表格

這將生成一個(gè)簡(jiǎn)單的三維面積圖馏鹤,其中第三個(gè)軸可用于替換圖例:

SampleArea3D

實(shí)測(cè)使用WPS不支持該方法創(chuàng)建三維面積圖

條形圖和柱形圖

在條形圖中,值被繪制為水平條或垂直列

\color {skyblue} {垂直娇哆,水平和堆疊條形圖}
\color {skyblue} {!筆記}
以下設(shè)置會(huì)影響不同的圖表類型湃累。
通過分別將類型設(shè)置為col或bar, 在垂直和水平條形圖之間切換碍讨。
使用堆疊圖表時(shí)治力,重疊部分需要設(shè)置為100。
如果條是水平的垄开,則x和y軸將反轉(zhuǎn)琴许。
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()  # 新建一個(gè)條形圖
chart1.type = 'col'  # 暫不知道該參數(shù)的解釋税肪,從實(shí)際表現(xiàn)上來看type決定了以垂直還是水平條形圖來顯示溉躲。['col':'垂直', 'bar':'水平']
chart1.style = 10  # 圖表的風(fēng)格設(shè)置為10
chart1.title = 'Bar Chart'  # 設(shè)置圖表的標(biāo)題
chart1.y_axis.title = 'Test number'  # 設(shè)置圖標(biāo)的x軸標(biāo)簽
chart1.x_axis.title = 'Sample length(mm)'  # 設(shè)置圖表的y軸標(biāo)簽

data = Reference(ws, min_col=2, min_row=1, max_row=7, max_col=3)  # 創(chuàng)建一個(gè)Reference對(duì)象[B1:C7]
cats = Reference(ws, min_col=1, min_row=2, max_row=7)  # 創(chuàng)建一個(gè)Reference對(duì)象[A2:A7]
chart1.add_data(data, titles_from_data=True)  # 添加數(shù)據(jù),并且從數(shù)據(jù)中獲取標(biāo)題
chart1.set_categories(cats)  # 設(shè)置類型為cats.
chart1.shape = 4  # 暫未從表現(xiàn)中看出有什么實(shí)際作用

ws.add_chart(chart1, 'A10') # 垂直條形圖

chart2 = deepcopy(chart1)  # 重新創(chuàng)建一個(gè)圖表深拷貝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')

這將產(chǎn)生四個(gè)圖表益兄,說明各種可能性锻梳。


image.png

##### \color {skyblue} {三維條形圖}

您還可以創(chuàng)建三維條形圖

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

這將生成一個(gè)簡(jiǎn)單的三維條形圖。

bar3d

實(shí)測(cè)使用WPS不支持該方法創(chuàng)建三維條形圖

note:有興趣的小伙伴可以幫忙看下在 office下的現(xiàn)象


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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末净捅,一起剝皮案震驚了整個(gè)濱河市疑枯,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蛔六,老刑警劉巖荆永,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件废亭,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡具钥,警方通過查閱死者的電腦和手機(jī)豆村,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來骂删,“玉大人掌动,你說我怎么就攤上這事∧担” “怎么了粗恢?”我有些...
    開封第一講書人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長欧瘪。 經(jīng)常有香客問我眷射,道長,這世上最難降的妖魔是什么恋追? 我笑而不...
    開封第一講書人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任凭迹,我火速辦了婚禮,結(jié)果婚禮上苦囱,老公的妹妹穿的比我還像新娘嗅绸。我一直安慰自己,他們只是感情好撕彤,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開白布鱼鸠。 她就那樣靜靜地躺著,像睡著了一般羹铅。 火紅的嫁衣襯著肌膚如雪蚀狰。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,772評(píng)論 1 290
  • 那天职员,我揣著相機(jī)與錄音麻蹋,去河邊找鬼。 笑死焊切,一個(gè)胖子當(dāng)著我的面吹牛扮授,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播专肪,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼刹勃,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了嚎尤?” 一聲冷哼從身側(cè)響起荔仁,我...
    開封第一講書人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后乏梁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體次洼,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年遇骑,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了滓玖。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡质蕉,死狀恐怖势篡,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情模暗,我是刑警寧澤禁悠,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站兑宇,受9級(jí)特大地震影響碍侦,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜隶糕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一瓷产、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧枚驻,春花似錦濒旦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至锉矢,卻和暖如春梯嗽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背沽损。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來泰國打工灯节, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人绵估。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓炎疆,卻偏偏與公主長得像,于是被迫代替她去往敵國和親壹士。 傳聞我的和親對(duì)象是個(gè)殘疾皇子磷雇,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容