Python-openpyxl教程7 - 图表之散点图,饼图和环形图

前文:
Python-openpyxl教程1 - openpyxl简介
Python-openpyxl教程2 - 简单使用
Python-openpyxl教程3 - 读写性能
Python-openpyxl教程4 - 优化模式
Python-openpyxl教程5 - 与Pandas交互
Python-openpyxl教程6 - 图表之面积图和条形图


散点图

散点图或xy图类似于某些折线图。主要区别在于,一个系列的值相对于另一个系列被绘制。当值无序时,这很有用。

from openpyxl import Workbook
from openpyxl.chart import ScatterChart, Reference, Series, marker

wb = Workbook()
ws = wb.active

rows = [
    ['Size', 'Batch 1', 'Batch 2'],
    [2, 40, 30],
    [3, 40, 25],
    [4, 50, 30],
    [5, 30, 25],
    [6, 25, 35],
    [7, 20, 40]
]
for row in rows:
    ws.append(row)

chart = ScatterChart()
chart.title = 'Scatter Chart'
chart.style = 13
chart.x_axis.title = 'Size'
chart.y_axis.title = 'Percentage'

xvalues = Reference(ws, min_col=1, min_row=2, max_row=7)

for i in range(2, 4):
    values = Reference(ws, min_col=i, min_row=1, max_row=7)
    # Series(values, xvalues, zvalues, title, title_from_data)
    series = Series(values, xvalues=xvalues, title_from_data=True)
    chart.series.append(series)
    series.marker = marker.Marker('dot')  # 修改标记点样式。默认是没有标记点的。
    series.graphicalProperties.line.noFill = True  # 是否有线条。

ws.add_chart(chart, 'A10')

wb.save('SampleScatter.xlsx')
\color {skyblue} {!笔记}
规范指出散点图有以下几种类型: "线","线标记","标记","平滑","平滑标记"。但是,至少在Microsoft Excel中,这只是其他设置的快捷方式,否则这些设置无效。为了与折线图保持一致,应手动设置每个系列的样式
散点图

原文代码中散点图的系列样式和折线一样,因此加上了修改系列的样式的方法。修改为其他散点样式。
marker.Marker 可选项有: 'x', 'dash', 'square', 'circle', 'auto', 'picture', 'triangle', 'diamond', 'dot', 'plus', 'star'

饼状图

饼状图

饼图将数据绘制为一个圆的切片,每个切片代表整个百分比。切片按顺时针方向绘制,圆的顶部为0°。饼图只能获取单个数据系列。图表标题将默认为系列标题。

from copy import deepcopy

from openpyxl import Workbook
from openpyxl.chart import PieChart, Reference, ProjectedPieChart
from openpyxl.chart.series import DataPoint

data = [
    ['pie', 'Sold'],
    ['Apple', 50],
    ['Cherry', 30],
    ['Pumpkin', 10],
    ['Chocolate', 40]
]

wb = Workbook()
ws = wb.active
for row in data:
    ws.append(row)

pie = PieChart()
labels = Reference(ws, min_col=1, min_row=2, max_row=5)
data = Reference(ws, min_col=2, min_row=1, max_row=5)
pie.add_data(data, titles_from_data=True)
pie.set_categories(labels)  # 设置周标签名称
pie.title = 'Pies sold by category'

# 把饼图的第一片切下来
slice = DataPoint(idx=0, explosion=20)  # DataPoint: idx:某个数据的下标, 切片和饼图距离
pie.series[0].data_points = [slice]  # data_points 是一个列表,里面可以存放多个DataPoint对象。

ws.add_chart(pie, 'D1')

ws = wb.create_sheet(title='Projection')
data = [
    ['Page', 'Views'],
    ['Search', 95],
    ['Products', 4],
    ['Offers', 0.5],
    ['Sales', 0.5]
]

for row in data:
    ws.append(row)

projected_pie = ProjectedPieChart()  # 创建一个投影图表对象
projected_pie.type = 'pie'  # 投影类型为饼图
projected_pie.splitType = 'val'  # 根据'值'(value)划分图表
labels = Reference(ws, min_col=1, min_row=2, max_row=5)
data = Reference(ws, min_col=2, min_row=1, max_row=5)
projected_pie.add_data(data, titles_from_data=True)
projected_pie.set_categories(labels)

ws.add_chart(projected_pie, 'A10')

projected_bar = deepcopy(projected_pie)
projected_bar.type = 'bar'  # 投影类型为条形图
projected_bar.splitType = 'pos'  # split by position

ws.add_chart(projected_bar, 'A27')

wb.save('SamplePie.xlsx')
饼图
投影饼图

投影饼图从饼图中提取一些切片,并将它们投影到第二个饼图或条形图中。当数据系列中有几个较小的项目时,这很有用。可以根据百分比,val(ue)或pos(ition)划分图表。如果为设置任何内容,则应用程序决定使用哪个。另外可以自定义拆分。


投影饼图
3D 饼图

也可以使用3D效果创建饼图。

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

data = [
    ['Pie', 'Sold'],
    ['Apple', 50],
    ['Cherry', 30],
    ['Pumpkin', 10],
    ['Chocolate', 40]
]

wb = Workbook()
ws = wb.active

for row in data:
    ws.append(row)

pie = PieChart3D()
labels = Reference(ws, min_col=1, min_row=2, max_row=5)
data = Reference(ws, min_col=2, min_row=1, max_row=5)
pie.add_data(data, titles_from_data=True)
pie.set_categories(labels)
pie.title = 'Pies sold by category'

ws.add_chart(pie, 'D1')

wb.save('SamplePie3D.xlsx')
3D饼图

渐变饼图

饼图也可以使用梯度系列创建

暂无源码,百度未找到类似代码。有知道的可以帮给出下!!


环形图

环形图类似于饼图,不同之处在于他们使用环而不是圆。他们还可以将多个系列的数据绘制为同心环。

from copy import deepcopy

from openpyxl import Workbook
from openpyxl.chart import DoughnutChart, Reference, Series
from openpyxl.chart.series import DataPoint

data = [
    ['Pie', 2014, 2015],
    ['Plain', 40, 50],
    ['Jam', 2, 10],
    ['Lime', 20, 30],
    ['Chocolate', 30, 40]
]

wb = Workbook()
ws = wb.active

for row in data:
    ws.append(row)

chart = DoughnutChart()
labels = Reference(ws, min_col=1, min_row=2, max_row=5)  # 引用[A2:A5]
data = Reference(ws, min_col=2, min_row=1, max_row=5)  # 引用[B1:B5]
chart.add_data(data, titles_from_data=True)  # 图表添加数据
chart.set_categories(labels)  # 图表设置类别
chart.title = 'Doughnuts sold by category'
chart.style = 26

# cut the first slice out of the doughnut
slices = [DataPoint(idx=i) for i in range(4)]  # 创建四个DataPoint()对象
plain, jam, lime, chocolate = slices
chart.series[0].data_points = slices
plain.graphicalProperties.solidFill = 'FAE1D0'  # 设置plain数据点的填充颜色
jam.graphicalProperties.solidFill = 'BB2244'  # 设置jam数据点的填充颜色
lime.graphicalProperties.solidFill = '22DD22'  # 设置lime数据点的填充颜色
chocolate.graphicalProperties.solidFill = '61210B'  # 设置chocolate数据点的填充颜色
chocolate.explosion = 10  # 切出去的块的距离

ws.add_chart(chart, 'E1')

chart2 = deepcopy(chart)
chart2.title = None
data = Reference(ws, min_col=3, min_row=1, max_row=5)
series2 = Series(data, title_from_data=True)
chart2.series.append(series2)

ws.add_chart(chart2, 'E17')
wb.save('SampleDoughnut.xlsx')
环形图

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

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