Python-openpyxl教程8 - 图表之雷达图,股价图和曲面图图

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


雷达图

可以在雷达图中绘制工作表中按列或行排列的数据。雷达图比较多个数据系列的合计值。它实际上是面积图在圆形x轴的投影。

雷达图有两种类型:"标准图", 用线标出区域;"填充图",用线填充整个区域。附件类型"marker"无效。如果需要标记,可以为相关系列设置这些标记。

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

wb = Workbook()
ws = wb.active

rows = [
    ['Month', 'Bulbs', 'Seeds', 'Flowers', 'Trees % shrubs'],
    ['Jan', 0, 2500, 500, 0],
    ['Feb', 0, 5500, 750, 1500],
    ['Mar', 0, 9000, 1500, 2500],
    ['Apr', 0, 6500, 2000, 4000],
    ['May', 0, 3500, 5500, 3500],
    ['Jun', 0, 0, 7500, 1500],
    ['Jul', 0, 0, 8500, 800],
    ['Aug', 1500, 0, 7000, 550],
    ['Sep', 5000, 0, 3500, 2500],
    ['Oct', 8500, 0, 2500, 6000],
    ['Nov', 3500, 0, 500, 5500],
    ['Dec', 500, 0, 100, 3000],
]

for row in rows:
    ws.append(row)

chart = RadarChart()
chart.type = 'filled'   # 图表类型为填充
labels = Reference(ws, min_col=1, min_row=2, max_row=13)
data = Reference(ws, min_col=2, max_col=5, min_row=1, max_row=13)
chart.add_data(data, titles_from_data=True)
chart.set_categories(labels)
chart.style = 26
chart.title = 'Garden Center Sales'
chart.y_axis.delete = True

# from copy import deepcopy
# chart2 = deepcopy(chart)
# chart2.type = 'standard'  # 图表类型为标准
# ws.add_chart(chart2,'A33')

ws.add_chart(chart, 'A17')

wb.save('SampleRadar.xlsx')
雷达图

股价图

在工作表上按特定顺序排列在列或行中的数据可以在股价图表中绘制。顾名思义,最常使用股价图表来说明股票价格波动。但是,此图标也可以用于科学数据。例如,您可以使用股价图来指示每日或每年的温度波动。您必须按照正确的顺序组织数据才能创建股价图。

工作表中的组织结构图数据的组织方式非常重要。例如,要创建一个简单的高-低-收盘价股价图,您应该按此顺序排列数据,分别以高,低和收盘价作为栏标题输入。

尽管股价图是一种独特的类型,但是各种类型只是特定格式选项的快捷方式:
- 高-低-收盘价基本是没有线的折线图,并且标记设置XYZ。还将hiLowLines设置为True
- 开-高-低-收盘价与高-低-收盘价图表相同,每个数据点的标记设置为XYZ和upDownLines。

可以通过将股价图和条形图相结合来添加体积。

from copy import deepcopy

from openpyxl import Workbook
from openpyxl.chart import BarChart, StockChart, Reference
from openpyxl.chart.axis import ChartLines
from openpyxl.chart.data_source import NumData, NumVal
from openpyxl.chart.updown_bars import UpDownBars

wb = Workbook()
ws = wb.active

rows = [
    ['Date', 'Volume', 'Open', 'High', 'Low', 'Close'],
    ['2015-01-01', 20000, 26.20, 27.20, 23.49, 25.45],
    ['2015-01-02', 10000, 25.45, 25.03, 19.55, 23.05],
    ['2015-01-03', 15000, 23.05, 24.46, 20.03, 22.42],
    ['2015-01-04', 2000, 22.42, 23.97, 20.07, 21.90],
    ['2015-01-05', 12000, 21.90, 23.65, 19.50, 21.51]
]

for row in rows:
    ws.append(row)

# High->Low->Close
chart1 = StockChart()  # 创建一个股价图对象
labels = Reference(ws, min_col=1, min_row=2, max_row=6)  # 引用数据[A2:A6] -> labels
data = Reference(ws, min_col=4, max_col=6, min_row=1, max_row=6)  # 引用数据[D1:F6] -> data
chart1.add_data(data, titles_from_data=True)  # chart1添加数据,并且从引用数据data中获取标题 [High, Low, Close]
chart1.set_categories(labels)  # 引用数据labels设置类别 [2015-01-01, 2015-01-02, 2015-01-03, 2015-01-04, 2015-01-05]
"""
series: 系列. 
使用add_data的时候里面添加了几个系列. 则series里面有几个Series对象。
"""
for s in chart1.series:
    # graphicalProperties 图形属性
    s.graphicalProperties.line.noFill = True

# marker for close
s.marker.symbol = 'dot'  # 标记close的值,等效于 chart1.series[-1].marker.symbol = 'dot'
s.marker.size = 5  # 标记的大小,等效于 chart1.series[-1].marker.size = 5

chart1.title = 'High-low-close'  # chart1 的标题
chart1.hiLowLines = ChartLines()  # 定义一个高低线对象,但是此时并不会显示

# Excel is broken and needs a cache of values in order to display hiLowLines.
# Excel 已经损坏,需要一个缓存值才能显示高低线 (NumVal和NumData暂未找到相关的解释点)
pts = [NumVal(idx=i) for i in range(len(data) - 1)]
cache = NumData(pt=pts)
chart1.series[-1].val.numRef.numCache = cache
ws.add_chart(chart1, 'A10')

# Open-high-low-close
chart2 = StockChart()
data = Reference(ws, min_col=3, max_col=6, min_row=1, max_row=6)
chart2.add_data(data, titles_from_data=True)
chart2.set_categories(labels)

for s in chart2.series:
    s.graphicalProperties.line.noFill = True
chart2.hiLowLines = ChartLines()
chart2.upDownBars = UpDownBars()
chart2.title = 'Open-high-low-close'

# add dummy cache
chart2.series[-1].val.numRef.numCache = cache

ws.add_chart(chart2, 'I10')

# Create bar chart for volume

bar = BarChart()
data = Reference(ws, min_col=2, min_row=1, max_row=6)
bar.add_data(data, titles_from_data=True)
bar.set_categories(labels)

# Volume-high-low-close
bar1 = deepcopy(bar)
chart3 = deepcopy(chart1)
chart3.y_axis.majorGridlines = None
chart3.y_axis.title = 'Price'
bar1.y_axis.axId = 20
bar1.z_axis = chart3.y_axis
bar1.y_axis.crosses = 'max'
bar1 += chart3

chart3.title = 'High low close volume'

ws.add_chart(bar1, 'A27')

# Volume-open-high-low-close
bar2 = deepcopy(bar)
chart4 = deepcopy(chart2)
# majorGridlines : 主要网格线
chart4.y_axis.majorGridlines = None
chart4.y_axis.title = 'Price'
bar2.y_axis.axId = 20
bar2.z_axis = chart4.y_axis
bar2.y_axis.crosses = 'max'
bar2 += chart4

ws.add_chart(bar2, 'I27')

wb.save('SampleStock.xlsx')
股价图

曲面图

可以在曲面图中绘制工作表中按列或行排列的数据。当您想在两组数据之间找到最佳组合时,曲面图很有用。与地图地形一样,颜色和图案表示在相同值范围内的区域。

默认情况下所有曲面图都是三维的。通过设置I旋转和透视图,可以创建二维线框和轮廓图。

from copy import deepcopy

from openpyxl import Workbook
from openpyxl.chart import SurfaceChart, SurfaceChart3D, Reference

wb = Workbook()
ws = wb.active

data = [
    [None, 10, 20, 30, 40, 50],
    [0.1, 15, 65, 105, 65, 15, ],
    [0.2, 35, 105, 170, 105, 35, ],
    [0.3, 55, 135, 215, 135, 55, ],
    [0.4, 75, 155, 240, 155, 75, ],
    [0.5, 80, 190, 245, 190, 80, ],
    [0.6, 75, 155, 240, 155, 75, ],
    [0.7, 55, 135, 215, 135, 55, ],
    [0.8, 35, 105, 170, 105, 35, ],
    [0.9, 15, 65, 105, 65, 15],
]

for row in data:
    ws.append(row)

chart1 = SurfaceChart()
ref = Reference(ws, min_col=2, max_col=6, min_row=1, max_row=10)
labels = Reference(ws, min_col=1, min_row=2, max_row=10)
chart1.add_data(ref, titles_from_data=True)
chart1.set_categories(labels)
chart1.title = 'Contour'

ws.add_chart(chart1, 'A12')

# wireframe :线框
chart2 = deepcopy(chart1)
chart2.wireframe = True
chart2.title = '2D Wireframe'

ws.add_chart(chart2, 'I12')

# 3D Surface
chart3 = SurfaceChart3D()
chart3.add_data(ref, titles_from_data=True)
chart3.set_categories(labels)
chart3.title = 'Surface'

ws.add_chart(chart3, 'A29')

chart4 = deepcopy(chart3)
chart4.wireframe = True
chart4.title = '3D Wireframe'

ws.add_chart(chart4, 'I29')

wb.save('SampleSurface.xlsx')
曲面图

来源:https://openpyxl.readthedocs.io/en/stable/charts/introduction.html#chart-types

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

推荐阅读更多精彩内容