OpenPyXLでExcelワークシートに面グラフや3D面グラフを作成したり、グラフの種類を積み上げ面グラフ/100%積み上げ面グラフに変更したりする方法を紹介する。
この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
from openpyxl import Workbook
wb = Workbook()
ws = wb.active
values = [
('YEAR', 'A', 'B', 'C'),
(2018, 750, 500, 300),
(2019, 850, 700, 400),
(2020, 700, 650, 500),
(2021, 900, 800, 400)
]
for v in values:
ws.append(v)
from openpyxl.chart import AreaChart, Reference
rmin = ws.min_row
rmax = ws.max_row
cmin = ws.min_column
cmax = ws.max_column
chart = AreaChart()
src = Reference(ws, min_col=cmin+1, min_row=rmin, max_col=cmax, max_row=rmax)
chart.add_data(src, titles_from_data=True)
cat = Reference(ws, min_col=cmin, min_row=rmin+1, max_row=rmax) # 項目名の設定
chart.set_categories(cat)
chart.title = 'Sample Chart' # グラフタイトル
chart.x_axis.title = 'YEAR' # 軸ラベル
chart.y_axis.title = 'SALES'
chart.anchor = 'A7' # グラフの表示位置
chart.width = 16 # グラフのサイズ
chart.height = 8
ws.add_chart(chart)
wb.save('sample_chart.xlsx')
# グラフのスタイルの変更
chart.grouping = 'stacked' # 積み上げ面グラフ
chart.grouping = 'percentStacked' # 100%積み上げ面グラフ
from openpyxl.chart import AreaChart3D
chart = AreaChart3D()
src = Reference(ws, min_col=cmin+1, min_row=rmin, max_col=cmax, max_row=rmax)
chart.add_data(src, titles_from_data=True)
cat = Reference(ws, min_col=cmin, min_row=rmin+1, max_row=rmax) # 項目名の設定
chart.set_categories(cat)
chart.title = 'Sample Chart' # グラフタイトル
chart.x_axis.title = 'YEAR' # 軸ラベル
chart.y_axis.title = 'SALES'
chart.anchor = 'A24' # グラフの表示位置
chart.width = 16 # グラフのサイズ
chart.height = 8
ws.add_chart(chart)
wb.save('sample_chart.xlsx')
# 3次元面グラフでは第3軸のラベルが凡例と同じなので凡例を削除
chart.legend = None
# 系列の順序を入れ替える
chart.ser[0], chart.ser[2] = chart.ser[2], chart.ser[0]
wb.save('sample_chart.xlsx')
本稿では主に以下のコードで作成したワークシートを例に取る。
from openpyxl import Workbook
wb = Workbook()
ws = wb.active
values = [
('YEAR', 'A', 'B', 'C'),
(2018, 750, 500, 300),
(2019, 850, 700, 400),
(2020, 700, 650, 500),
(2021, 900, 800, 400)
]
for v in values:
ws.append(v)
このコードを実行してできたワークシートをExcelで表示したものが以下だ。
OpenPyXLを使って面グラフを作成するには、openpyxl.chart.AreaChartクラスを使用する。その手順は以下の通り。
面グラフ(AreaChart)で設定できる項目としては以下がある(一部)。
属性 | 説明 |
---|---|
title属性 | グラフのタイトル |
x_axis.title属性 | X軸のラベル |
y_axis.title属性 | Y軸のラベル |
anchor属性 | ワークシート上での表示位置(左上) |
width属性 | グラフの横幅 |
height属性 | グラフの高さ |
grouping属性 | グラフの種類 |
style属性 | グラフのスタイル |
set_categoriesメソッド | X軸の項目名の設定 |
AreaChartで設定できる項目(一部) |
以下にこれらの設定を行って、面グラフを作成する例を示す。
from openpyxl.chart import AreaChart, Reference
rmin = ws.min_row
rmax = ws.max_row
cmin = ws.min_column
cmax = ws.max_column
chart = AreaChart()
src = Reference(ws, min_col=cmin+1, min_row=rmin, max_col=cmax, max_row=rmax)
chart.add_data(src, titles_from_data=True)
cat = Reference(ws, min_col=cmin, min_row=rmin+1, max_row=rmax) # 項目名の設定
chart.set_categories(cat)
chart.title = 'Sample Chart' # グラフタイトル
chart.x_axis.title = 'YEAR' # 軸ラベル
chart.y_axis.title = 'SALES'
chart.anchor = 'A7' # グラフの表示位置
chart.width = 16 # グラフのサイズ
chart.height = 8
ws.add_chart(chart)
wb.save('sample_chart.xlsx')
title属性やanchor属性など、多くの属性については上のコードを見れば、設定方法は分かるだろう(「OpenPyXLを使ってExcelワークシートに棒グラフを作成するには」でも取り上げているのでそちらも参照されたい)。
上のコードでは、変数srcにグラフ描画の基となるセル範囲を指定している。このとき、セル範囲の一番左の列を除外している(src = Reference(ws, min_col=cmin+1, min_row=rmin, max_col=cmax, max_row=rmax))。これは一番左の列をX軸に表示する項目名(2018〜2021年)として使用するからだ。そして、変数catには今述べた一番左の列をReferenceクラスのインスタンスに指定して、それをset_categoriesメソッドに渡すようにしている。
一方、系列や凡例に使われるA/B/Cは変数srcが参照するセル範囲に含まれている。これは、add_dataメソッドでこのセル範囲をグラフ(変数chartが参照するAreaChartオブジェクト)に追加する際に「titles_from_data=True」として、セル範囲の先頭を系列名として使用するようにしているからだ。
上のコードで作成した面グラフを以下に示す。
Copyright© Digital Advantage Corp. All Rights Reserved.