[解決!Python]Excelワークシートに円グラフを作成するには(OpenPyXL)解決!Python

OpenPyXLが提供するPieChartクラスとProjectedPieChartクラスを用いて、円グラフと補助グラフ付円グラフを作成する方法を紹介する。

» 2022年03月25日 05時00分 公開
[かわさきしんじDeep Insider編集部]

この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。

「解決!Python」のインデックス

連載目次

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.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。