openpyxlを使用してExcelのグラフ作成を自動化する方法を紹介します。
エンジニアならばデータの可視化ならMatplotlibでいいじゃないか!?と思いがちですが、一般的にExcelでデータを残して欲しいという要望は多いと思います。
でも、Excelのグラフ作成は意外と面倒な作業です。
Excelのグラフ作成がルーチンワーク化している作業ならば、尚更、Pyothonでサクッと終わらすことが出来てしまえばうれしい限りです。
幸いにしてPythonにはExcelを操作するライブラリが沢山そろっています。
今回はその中の1つ、openpyxlを使用してExcelのグラフ作成作業を自動化する方法を紹介します。
openpyxlを使えば、Excelでデータを残す為に頑張ってVBAを使う必要もありません。
アンチExcelな人は、openpyxlを使って面倒なExcelの作業から解放されましょう。
環境
今回使用したPythonとopenpyxlのバージョンは以下の通りです。なお、環境構築はAnacondaを使用しております。
- Python = 3.6.10
- openpyxl = 3.0.3
モジュールのインポートとExcelへ書き込み
Workbook、ScatterChart、Reference、Seriesをインポートし、以下の手順でExcelに書き込みます。
- Excelへの書き込むためには、まず、Workbookでワークブック作成します。
- 次に、ワークブックオブジェクトのcreate_sheet()メソドットでワークシートを作成します。
- そして、ワークシートオブジェクトのcell()メソッドを使用して書き込みます。
#今回使うモジュールの読み込み
from openpyxl import Workbook
from openpyxl.chart import ScatterChart, Reference, Series
#openpyxlのバージョンを表示
print(openpyxl.__version__)
#作成するExcelファイル名
filename = "openpyxl_chart.xlsx"
#ワークブックの作成
wb = Workbook()
#ワークシートの作成。第1引数にシート名、第2引数に挿入位置
ws = wb.create_sheet("sheet01", 0)
#データ作成
X = np.arange(0, 100, 5)
Y1 = X
Y2 = 2 * X
Y3 = 3 * X
len_data = len(X)
#セルへの書き込み.row=1でA行、column=1で1列目を選択
#A1セルへ書き込み
ws.cell(row = 1, column = 1, value = "X")
#B1セルへ書き込み
ws.cell(row = 1, column = 2, value = "Y1")
#C1セルへ書き込み
ws.cell(row = 1, column = 3, value = "Y2")
#D1セルへ書き込み
ws.cell(row = 1, column = 4, value = "Y3")
for i in range(0, len_data):
ws.cell(row= i + 2, column = 1, value = X[i])
ws.cell(row= i + 2, column = 2, value = Y1[i])
ws.cell(row= i + 2, column = 3, value = Y2[i])
ws.cell(row= i + 2, column = 4, value = Y3[i])
グラフの作成
Excelに書き込みが出来たら、グラフを作成します。今回は散布図を作成します。
最初のコードに書いてあるように、ScatterChart、Reference、Seriesをインポートします。
from openpyxl.chart import ScatterChart, Reference, Series
- ScatterChartオブジェクトを作成します。
- X軸とY軸の範囲設定の為にReferenceオブジェクトを作成します。
Reference()にワークシートオブジェクトと選択範囲を渡します。
選択開始位置をmin_row(行)とmin_col(列)で指定し、選択終了位置はmax_rowとmax_colで指定します。 - 系列を追加する為にSeriesオブジェクトを作成します。Series()にX、Y軸設定用のReferenceオブジェクトを渡します。
#ScatterChartオブジェクトを作成
chart = ScatterChart()
num_series = 3
min_row = 2
max_row = min_row + len_data - 1
#グラフのX軸の範囲を設定する為に、Referenceオブジェクト作る
x_values = Reference(ws, min_col = 1, min_row = min_row, max_row = max_row)
#データの書き込み
for i in range(0, num_series):
min_col = i + 2
#データの範囲(Y軸)をReferenceで選択
values = Reference(ws, min_col = min_col, min_row = min_row, max_row = max_row)
#Seriesオブジェクトを作成
series = Series(values, x_values, title="hoge")
このようなグラフが作成されます。

グラフの体裁を整える
グラフの見た目を簡単に整えます。
フォントや線の太さを変えるのは少々複雑なので、今回は細かい設定はせず、ザックリと見た目を変えます。
● グラフの大きさ、タイトル、凡例の調整
グラフの大きさはチャートオブジェクトのheightプロパティ、widthプロパティで調整します。
タイトル、凡例はチャートオブジェクトのtitleプロパティ、legendプロパティで設定します。
#グラフの大きさ
chart.height = 10
chart.width = 10
#グラフの大きさ
chart.title = "Hoge"
#凡例
chart.legend = None
● 軸の調整
軸の調整はx_axis、y_axisプロパティで行います。
#目盛間隔
chart.x_axis.majorUnit = 10
chart.y_axis.majorUnit = 20
#補助目盛間隔
chart.x_axis.minorUnit = 5
chart.y_axis.minorUnit = 10
#グリッドラインを消す
chart.y_axis.majorGridlines = None
chart.x_axis.majorGridlines = None
#軸の向き(out, corss, inから選ぶ)
chart.x_axis.majorTickMark = "in"
chart.x_axis.minorTickMark = "in"
chart.y_axis.majorTickMark = "in"
chart.y_axis.minorTickMark = "in"

以上です。
線の太さやフォントの設定は少々面倒なので、別の機会に説明します。