[解決!Python]Excelワークシートに円グラフを作成するには(OpenPyXL):解決!Python
OpenPyXLが提供するPieChartクラスとProjectedPieChartクラスを用いて、円グラフと補助グラフ付円グラフを作成する方法を紹介する。
from openpyxl import Workbook
wb = Workbook()
ws = wb.active
values = [
['Product', 'sales'],
['A', 345678],
['B', 234567],
['C', 87654],
['D', 9876],
['E', 12345]
]
for v in values:
ws.append(v)
wb.save('sample_chart.xlsx')
from openpyxl.chart import Reference, PieChart
rmin = ws.min_row
rmax = ws.max_row
cmin = ws.min_column
cmax = ws.max_column
chart = PieChart()
labels = Reference(ws, min_col=cmin, min_row=rmin+1, max_row=rmax)
src = Reference(ws, min_col=cmax, min_row=rmin, max_row=rmax)
chart.add_data(src, titles_from_data=True)
chart.set_categories(labels)
chart.title = 'sales' # グラフタイトル
chart.anchor = 'A9' # グラフの表示位置
chart.width = 16 # グラフのサイズ
chart.height = 8
ws.add_chart(chart)
wb.save('sample_chart.xlsx')
# 円グラフから特定の構成要素を切り離して強調表示
from openpyxl.chart.series import DataPoint
slice0 = DataPoint(idx=0, explosion=10)
slice1 = DataPoint(idx=1, explosion=20)
chart.ser[0].data_points = [slice0, slice1]
wb.save('sample_chart.xlsx')
# 上記のセル範囲の値を変更
new_values = [422, 160, 30, 5, 12]
for idx, val in enumerate(new_values, 2):
ws.cell(row=idx, column=2).value = val
# 補助円グラフ付き円グラフ
from openpyxl.chart import ProjectedPieChart
chart = ProjectedPieChart()
chart.type = "pie"
chart.splitType = 'percent'
labels = Reference(ws, min_col=cmin, min_row=rmin+1, max_row=rmax)
data = Reference(ws, min_col=cmin+1, min_row=rmin, max_row=rmax)
chart.add_data(data, titles_from_data=True)
chart.set_categories(labels)
chart.anchor = 'A28'
ws.add_chart(chart)
wb.save('sample_chart.xlsx')
# 補助縦棒付き円グラフ
chart.type = 'bar'
wb.save('sample_chart.xlsx')
サンプルのワークシート
本稿では主に以下のコードで作成したワークシートを例に取る。
from openpyxl import Workbook
wb = Workbook()
ws = wb.active
values = [
['Product', 'sales'],
['A', 345678],
['B', 234567],
['C', 87654],
['D', 9876],
['E', 12345]
]
for v in values:
ws.append(v)
Excelでこれを表示したものを以下に示す。
この値は、後で以下のコードを用いて変更する(補助円グラフ付き円グラフ作成時)。
new_values = [422, 160, 30, 5, 12]
for idx, val in enumerate(new_values, 2):
ws.cell(row=idx, column=2).value = val
円グラフ
OpenPyXLを使って円グラフを作成するには、openpyxl.chart.PieChartクラスやopenpyxl.chart.ProjectedPieChartクラスを使用する。その手順は以下の通り。
- PieChartクラスまたはProjectedPieChartクラスのインスタンス(グラフ)を生成する
- Referenceクラスを使って、グラフ作成の基となる範囲を指定する
- グラフにデータ(上で作成したReferenceクラスのインスタンス)を渡す
- グラフのタイトルなどの設定を行う
- ワークシートにグラフを挿入する
円グラフ(PieChart)で設定できる項目としては以下がある(一部)。
属性 | 説明 |
---|---|
title属性 | グラフのタイトル |
anchor属性 | グラフの挿入位置 |
width属性 | グラフの横幅 |
height属性 | グラフの高さ |
ser属性 | 系列ごとのマーカーや線種の設定 |
円グラフに設定可能な項目(一部) |
PieChartクラスを使って散布図を作成するための基本となるコードを以下に示す。
from openpyxl.chart import Reference, PieChart
rmin = ws.min_row
rmax = ws.max_row
cmin = ws.min_column
cmax = ws.max_column
chart = PieChart()
labels = Reference(ws, min_col=cmin, min_row=rmin+1, max_row=rmax)
src = Reference(ws, min_col=cmax, min_row=rmin, max_row=rmax)
chart.add_data(src, titles_from_data=True)
chart.set_categories(labels)
chart.title = 'sales' # グラフタイトル
chart.anchor = 'A9' # グラフの表示位置
chart.width = 16 # グラフのサイズ
chart.height = 8
ws.add_chart(chart)
このコード例では、PieChartクラスのインスタンスを作成している。その後、変数labelsに項目名となるセル範囲を指定し、変数dataにはグラフ描画の基となるセル範囲を指定している(系列名を含む)。そして、add_dataメソッドでそれらをグラフに設定している(このときには、変数srcに指定したセル範囲に系列名が含まれていることを示すために「titles_from_data=True」を指定している。ただし、ここでは系列は「sales」だけだ)。次に、グラフのタイトルとサイズを指定してから、ワークシートにグラフを挿入している。
このコードを実行すると、次のようなグラフが描かれる。
円グラフを構成する要素を、円グラフから切り離して、その部分だけを強調するようなことも可能だ。これにはDataPointクラスを使用する。
Copyright© Digital Advantage Corp. All Rights Reserved.