[解決!Python]Excelワークシートにレーダーチャートを作成するには(OpenPyXL)解決!Python

OpenPyXLのRadarChartクラスを使って、Excelのワークシートにレーダーチャートを作成したり、その種類を変更したりする方法を紹介する。

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

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

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

連載目次

from openpyxl import Workbook

wb = Workbook()
ws = wb.active

values = [
    ['Team', 'A', 'B', 'C'],
    ['Attack', 85, 70, 65],
    ['Defense', 72, 58, 65],
    ['Organize', 83, 55, 68],
    ['Talent', 80, 78, 55],
    ['Budget', 69, 80, 55]
]

for v in values:
    ws.append(v)

wb.save('sample_chart.xlsx')

from openpyxl.chart import Reference, RadarChart

rmin = ws.min_row
rmax = ws.max_row
cmin = ws.min_column
cmax = ws.max_column

chart = RadarChart()
chart.type = 'standard'  # 'filled', 'marker', 'standard'
labels = Reference(ws, min_col=cmin, min_row=rmin+1, max_row=rmax)
data = Reference(ws, min_col=cmin+1, max_col=cmax, min_row=rmin, max_row=rmax)
chart.add_data(data, titles_from_data=True)
chart.set_categories(labels)
chart.title = 'Team analysis'
chart.anchor = 'A10'

ws.add_chart(chart)
wb.save('sample_chart.xlsx')

# レーダーチャートの種類を変更
chart.type = 'marker'
wb.save('sample_chart.xlsx')

chart.type = 'filled'
wb.save('sample_chart.xlsx')


サンプルのワークシート

 本稿では以下のコードで作成したワークシートを例に取る。

from openpyxl import Workbook

wb = Workbook()
ws = wb.active

values = [
    ['Team', 'A', 'B', 'C'],
    ['Attack', 85, 70, 65],
    ['Defense', 72, 58, 65],
    ['Organize', 83, 55, 68],
    ['Talent', 80, 78, 55],
    ['Budget', 69, 80, 55]
]

for v in values:
    ws.append(v)


 これは架空のチームA、B、Cの攻撃力、守備力、組織性、個人能力、予算を数値化したものだ。Aは予算が(Bと比べて)少ないことを除けば、全ての面で優れている。Bは潤沢な予算を使って能力の高い選手を獲得しているが、それがチーム全体の攻撃力や守備力につながっていないようだ。Cは少ない予算と他の2チームに比べると能力が低い選手を組織化してほどほどの成績を上げていると考えられる。

 これをExcelで表示したものを以下に示す。

サンプルのワークシート サンプルのワークシート

レーダーチャート

 OpenPyXLを使ってレーダーチャートを作成するには、openpyxl.chart.RadarChartクラスを使用する。その手順は以下の通り。

  • RadarChartクラスのインスタンス(グラフ)を生成する
  • Referenceクラスを使って、グラフ作成の基となる範囲を指定する
  • グラフにデータ(上で作成したReferenceクラスのインスタンス)を渡す
  • グラフのタイトルなどの設定を行う
  • ワークシートにグラフを挿入する

 レーダーチャート(RadarChart)で設定できる項目としては以下がある(一部)。

属性 説明
type属性 レーダーチャートの種類を指定
title属性 グラフのタイトル
anchor属性 グラフの挿入位置
width属性 グラフの横幅
height属性 グラフの高さ
ser属性 系列ごとのマーカーや線種の設定
レーダーチャートに設定可能な項目(一部)

 type属性にはレーダーチャートの種類を指定する。指定可能な値は'standard'(標準のレーダーチャート)、'marker'(マーカー付きレーダーチャート)、'filled'(塗りつぶしレーダーチャート)のいずれかだ。マーカー付きレーダーチャートにするときには、各系列のmarker.symbol属性などでマーカーの形状や線色、塗りつぶし色などを指定する。

 RadarChartクラスを使って散布図を作成するための基本となるコードを以下に示す。x_axis.title属性やy_axis.title属性は設定可能だが、グラフ描画では使用されないようだ。レーダーチャートなのでX軸が表示されることはなく、特に何も指定をしないとデフォルトでY軸が表示されるがあまり意味がない。

 レーダーチャートを表示するコードの例を以下に示す。

from openpyxl.chart import Reference, RadarChart

rmin = ws.min_row
rmax = ws.max_row
cmin = ws.min_column
cmax = ws.max_column

chart = RadarChart()
chart.type = 'standard'  # 'filled', 'marker', 'standard'
labels = Reference(ws, min_col=cmin, min_row=rmin+1, max_row=rmax)
data = Reference(ws, min_col=cmin+1, max_col=cmax, min_row=rmin, max_row=rmax)
chart.add_data(data, titles_from_data=True)
chart.set_categories(labels)
chart.title = 'Team analysis'
chart.anchor = 'A10'

ws.add_chart(chart)


 このコード例では、RadarChartクラスのインスタンスを作成している。その後、変数labelsに項目名となるセル範囲を指定し、変数dataにはグラフ描画の基となるセル範囲を指定している(系列名を含む)。そして、add_dataメソッドでそれらをグラフに設定している(このときには、変数dataに指定したセル範囲に系列名が含まれていることを示すために「titles_from_data=True」を指定している。

 このコードを実行すると、次のようなグラフが描かれる。

レーダーチャート レーダーチャート

 特に指定をしない限り、上の画像のグラフ中央上部にあるようにY軸が無意味に表示されてしまう。これを抑制するにはy_axis.delete属性をTrueにする。

chart.y_axis.delete = True


 これによりY軸が表示されないようになる。

Y軸が表示されなくなった Y軸が表示されなくなった

 レーダーチャートの種類をマーカー付きにするには、type属性に'marker'を指定して、マーカーの種類や大きさなどを指定する。

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

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

メールマガジン登録

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