[解決!Python]OpenPyXLを使ってExcelワークシートに棒グラフを作成するには解決!Python

OpenPyXLでExcelワークシートに棒グラフを作成し、その設定を行い、最後に行と列が入れ替わっているデータで同じグラフを作成したりする方法を紹介。

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

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

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

連載目次

基本的な使い方

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

wb = Workbook()
ws = wb.active

values = [
    ('YEAR', 'A', 'B', 'C'),
    (2018, 500, 1400, 1700),
    (2019, 2000, 2700, 700),
    (2020, 2700, 2700, 900),
    (2021, 400, 2600, 1900)
]

for v in values:
    ws.append(v)

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

src = Reference(ws, min_col=cmin+1, min_row=rmin, max_col=cmax, max_row=rmax)
chart = BarChart()
chart.add_data(src, titles_from_data=True)
ws.add_chart(chart)

# グラフタイトルと軸ラベルの設定
chart.title = 'Sample Chart'
chart.x_axis.title = 'YEAR'
chart.y_axis.title = 'SALES'

# 項目名の設定
cat = Reference(ws, min_col=cmin, min_row=rmin+1, max_row=rmax)
chart.set_categories(cat)

# グラフの表示位置とサイズの設定
chart.anchor = 'A10'
chart.width = 20
chart.height = 15

# グラフのスタイルを変更する
chart.style = 12
chart.legend.position = 'b'

# 横棒グラフにする
chart.type = 'bar'

wb.save('sample_chart.xlsx')

# 表の行と列が入れ替わっている場合
wb = Workbook()
ws = wb.active

values = [  # values = list(zip(*values))
    ['YEAR', 2018, 2019, 2020, 2021],
    ['A', 500, 2000, 2700, 400],
    ['B', 1400, 2700, 2700, 2600],
    ['C', 1700, 700, 900, 1900]
]

for v in values:
    ws.append(v)

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

src = Reference(ws, min_col=cmin, max_col=cmax, min_row=rmin+1, max_row=rmax)
chart = BarChart()
chart.add_data(src, from_rows=True, titles_from_data=True)
chart.x_axis.title = 'YEAR'
chart.y_axis.title = 'SALES'
chart.title = 'Sample Chart'
cat = Reference(ws, min_col=cmin+1, max_col=cmax, min_row=rmin)
chart.set_categories(cat)
ws.add_chart(chart, 'A8')
wb.save('sample_chart.xlsx')


サンプルのワークシート

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

from openpyxl import Workbook

wb = Workbook()
ws = wb.active

values = [
    ('YEAR', 'A', 'B', 'C'),
    (2018, 500, 1400, 1700),
    (2019, 2000, 2700, 700),
    (2020, 2700, 2700, 900),
    (2021, 400, 2600, 1900)
]

for v in values:
    ws.append(v)

wb.save('sample_chart.xlsx')


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

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

基本的な使い方

 OpenPyXLパッケージを使うと、さまざまなグラフ(チャート)をワークシートに作成できる。OpenPyXLでグラフを作成する基本的な手順は次の通りだ。

  • Referenceクラスを使って、グラフ描画の基となる範囲を指定する
  • 作成したいグラフ(ここでは棒グラフ)に対応するクラス(ここではBarChartクラス)のインスタンスを生成する
  • 必要に応じてグラフに各種の設定を行う
  • グラフにデータ(上で作成したReferenceクラスのインスタンス)を渡す
  • ワークシートにグラフを追加する

 これをコードにしたものが以下だ(設定は特に行っていない)。

from openpyxl.chart import BarChart, Reference

# ワークシートで値が入力されている範囲を取得
rmin = ws.min_row
rmax = ws.max_row
cmin = ws.min_column
cmax = ws.max_column

src = Reference(ws, min_col=cmin+1, min_row=rmin, max_col=cmax, max_row=rmax)
chart = BarChart()
chart.add_data(src, titles_from_data=True)
ws.add_chart(chart)


 この例では、データが入力されているセル範囲の中で一番左の列を除外した部分をReferenceクラスに指定している(「min_col=cmin+1」という部分が該当)。一番左の列はグラフの項目名(ここでは年)であり、この設定を行う方法は後述する。なお、OpenPyXLではセルを参照するインデックスは1ベース(1から始まること)を忘れないようにしよう。

 次に、棒グラフに対応するBarChartクラスのインスタンスを生成している。そして、add_dataメソッドに上で作成したReferenceオブジェクトを渡している。同時に指定している「titles_from_data=True」は一番上の行を系列名として使用することを指示する。

 最後にadd_chartメソッドを使って、作成したグラフをワークシートに追加する。この時点での棒グラフを以下に示す。

グラフにタイトルや軸ラベルなどがない棒グラフ グラフにタイトルや軸ラベルなどがない棒グラフ

 元データとなっているセル範囲の一番上の行にある「A」「B」「C」が凡例の系列名になっている点に注意しよう(先ほども述べたが、一番左の列はグラフ描画の対象からは外れていて、これはX軸の項目名の設定で別途使用する)。

グラフタイトルと軸ラベルの設定

 グラフにタイトルを付けるにはグラフオブジェクトのtitle属性を、軸ラベルを設定するにはx_axis.title属性とy_axis.title属性を使用する。以下に例を示す。

chart.title = 'Sample Chart'
chart.x_axis.title = 'YEAR'
chart.y_axis.title = 'SALES'


 これらの設定を行った状態の棒グラフを以下に示す。上で指定した文字列がグラフのタイトルおよぶ軸ラベルになっていることに注目されたい。

グラフのタイトルと軸ラベルの設定を行ったところ グラフのタイトルと軸ラベルの設定を行ったところ

項目名の設定

 上のグラフではY軸の値は元データの値に合わせて0〜3000の間で設定されている。その一方で、X軸には年が入るべきところが「1」「2」「3」「4」となっている。ここに年を表示するには、グラフのset_categoriesメソッドを使って項目名を指定する必要がある。

 このメソッドでは、どの部分を項目名とするのかを最初に使用したReferenceクラスを使って指定する必要がある。ここでは先ほどからいっている通り、元データの一番左の列がそうだ。ただし、一番上の行にある「YEAR」は項目名にはしないことには注意。

 以下にそのコードを示す(以下のコードでは「min_row=rmin+1」として、項目名の範囲をその下の行からとしている)。

cat = Reference(ws, min_col=cmin, min_row=rmin+1, max_row=rmax)
chart.set_categories(cat)


 この設定を行うとグラフは次のようになる。年が項目名として設定されていることを確認されたい。

項目名を設定したグラフ 項目名を設定したグラフ

グラフの表示位置とサイズの設定

 グラフはデフォルトで、E15セルを左上の頂点として描画されるようになっている。これを変更するにはグラフのanchor属性に左上となる位置を指定する。また、グラフのサイズはwidth属性とheight属性を使って指定できる。以下に例を示す。

chart.anchor = 'A10'
chart.width = 20
chart.height = 15


 これらの設定を行った状態の棒グラフを以下に示す。

グラフの表示位置をサイズの設定を行ったところ グラフの表示位置をサイズの設定を行ったところ

グラフのスタイルを変更する

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

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

メールマガジン登録

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