【Python×Excel操作】エクセルのグラフ作成自動化・OpenPyXLによる多彩な書式設定・デザインまで徹底解説

こんにちは、Kosei(@kay_diacc2)です!

OpenPyXLによるExcel操作を取り扱ったPythonプログラミング記事です。本記事では、「グラフの作成方法」ついて解説します。また、グラフ作成はもちろん、グラフの詳細設定(グラフの種類・軸ラベル・スタイル設定等)も柔軟にプログラミングできるよう解説しています。

目次

OpenPyXLを活用したグラフ作成・Pythonプログラミング全体像

まず、本記事で作成するExcelファイルおよびグラフの完成イメージを示します。続いて、グラフ作成に向けたプログラミング手順を示します。

グラフ完成イメージ

上図のようなアウトプットを作成します。ポイントは以下です。

  • 棒グラフの作成
  • 2つの変数を比較した折線グラフの作成

上記を作成する中で、本記事では「多様な種類のグラフの作成方法」や「スタイル設定」などグラフ設定に関わる点は徹底解説しています。是非ご覧ください。

グラフ作成・プログラミング手順

下記の手順に従い、Pythonプログラミングを実施します。

  1. グラフ作成用のデータ準備
  2. Excelファイル新規作成
  3. Excel上にデータ書き込み
  4. グラフ作成

事前準備

PythonによるExcel操作では、OpenPyXLというモジュールを用います。下記コマンドをもとに事前にインストールしておきましょう。

pip install openpyxl

グラフ作成用のデータ準備

それではここからプログラミング解説に移ります。まず、グラフ作成に用いるデータをPython実行環境上で読み込みましょう。データセットは、A社株価とB社株価を示した時系列データを用いることとします。

import pandas as pd
from io import StringIO

csv_data = \
'''
日付,A社株価[円],B社株価[円]
2020-11-16, 1000, 1200
2020-11-17, 1010, 1150
2020-11-18, 1050, 1120
2020-11-19, 1050, 1050
2020-11-20, 1100, 970
2020-11-24, 1140, 880
'''

df = pd.read_csv(StringIO(csv_data))

Excelファイル新規作成

カレントディレクトリにExcelファイルを新規作成します。下記コードを実行します。

#モジュール読込
import openpyxl

#ファイル名
name = "グラフ作成.xlsx"

#Excelワークブック・シート作成
workbook = openpyxl.Workbook(name)
sheet = workbook.create_sheet(index=0)

#保存
workbook.save(name)

今回は内容割愛しますが、PythonによるExcelファイルの作成方法について詳しく知りたい方はこちらの記事もご覧ください。

Excel上にデータ書き込み

Python実行環境上に読み込んだデータをExcelファイル上に書き込みます。下記2パターンのコードのうち、どちらかを実行しましょう。

Pythonコード
パターン1:データ整形なし
import openpyxl

#Excelワークブック・シート読込
workbook = openpyxl.load_workbook(name)
sheet = workbook.active

#データ書き込み
sheet["A1"] = "A社・B社の株価比較"
sheet["A3"] = "日付"
sheet["B3"] = "A社株価[円]"
sheet["C3"] = "B社株価[円]"

for i in range(len(df)):
    sheet["A"+str(4+i)] = df.iloc[i,0]
    sheet["B"+str(4+i)] = df.iloc[i,1]
    sheet["C"+str(4+i)] = df.iloc[i,2]

#保存
workbook.save(name)
パターン2:日付をDatetimeに変換してデータ書き込みする場合
import openpyxl
from datetime import datetime

#Excelワークブック・シート読込
workbook = openpyxl.load_workbook(name)
sheet = workbook.active

#データ書き込み
sheet["A1"] = "A社・B社の株価比較"
sheet["A3"] = "日付"
sheet["B3"] = "A社株価[円]"
sheet["C3"] = "B社株価[円]"

for i in range(len(df)):
    sheet["A"+str(4+i)] = datetime.strptime(df.iloc[i,0], '%Y-%m-%d')
    sheet["B"+str(4+i)] = df.iloc[i,1]
    sheet["C"+str(4+i)] = df.iloc[i,2]

#保存
workbook.save(name)

グラフを作成する際、用いるデータ型を適した形式に事前変換しておく必要があります。今回の場合、X軸が日付の時系列グラフを作成します。そのため、[パターン2]で記載したコードのように、日付データはDatetime型に事前変換することを推奨します。データ型の変換が必要ないデータを用いる場合は、[パターン1]のまま利用いただいて問題ありません。

グラフ作成

続いて、グラフの作成方法です。上図のように「①単純な棒グラフ」および「②複数データを比較した折線グラフ」の作成方法に分けて解説します。

①単純な棒グラフ

下記にコードを全量示します。コードの詳細は、下記「グラフ作成におけるPyhonコード解説」で解説します。まずはグラフ作成におけるプログラミング方法の全体像を理解しましょう。

import openpyxl
from openpyxl.chart import Reference
from openpyxl.chart.axis import DateAxis

""" 01 グラフオブジェクト作成 """
graph_obj = openpyxl.chart.BarChart()    #グラフの種類
graph_obj.title  = "株価グラフ"            #グラフのタイトル
graph_obj.style  = 12                    #グラフのフォントサイズ
graph_obj.height = 10                    #高さ
graph_obj.width  = 15                    #幅

#Y軸設定
graph_obj.y_axis.title = "A社株価[円]"    #y軸ラベル
#X軸設定
graph_obj.x_axis.number_format = 'd-mmm' #日付対応(X軸が日付でなければ不要)
graph_obj.x_axis.majorTimeUnit = "days"  #日付対応(X軸が日付でなければ不要)
graph_obj.x_axis.title = "日付"

""" 02 データの範囲設定 """
#Y軸範囲
Y_axis = Reference(sheet, min_col=2, min_row=3, max_col=2, max_row=9)
graph_obj.add_data(Y_axis, titles_from_data=True)
#X軸範囲
X_axis = Reference(sheet, min_col=1, min_row=4, max_col=1, max_row=9)
graph_obj.set_categories(X_axis)

""" 03 グラフ配置 """
sheet.add_chart(graph_obj, "E3")

#保存
workbook.save(name)

②複数データを比較した折線グラフ

下記にコードを全量示します。

import openpyxl
from openpyxl.chart import Reference
from openpyxl.chart.axis import DateAxis

""" 01 グラフオブジェクト作成 """
graph_obj = openpyxl.chart.LineChart()  #グラフの種類
graph_obj.title  = "株価グラフ"           #グラフのタイトル
graph_obj.style  = 12                   #グラフのフォントサイズ
graph_obj.height = 10                   #高さ
graph_obj.width  = 15                   #幅

#Y軸設定
graph_obj.y_axis.title = "A社株価[円]"    #y軸ラベル
graph_obj.y_axis.crossAx = 500

#X軸設定
graph_obj.x_axis = DateAxis(crossAx=100)
graph_obj.x_axis.number_format = 'd-mmm' #日付対応(X軸が日付でなければ不要)
graph_obj.x_axis.majorTimeUnit = "days"  #日付対応(X軸が日付でなければ不要)
graph_obj.x_axis.title = "日付"

""" 02 データの範囲設定 """
#Y軸範囲
Y_axis = Reference(sheet, min_col=2, min_row=3, max_col=3, max_row=9)
graph_obj.add_data(Y_axis, titles_from_data=True)

#X軸範囲
X_axis = Reference(sheet, min_col=1, min_row=4, max_col=1, max_row=9)
graph_obj.set_categories(X_axis)

""" 03 グラフのスタイル詳細設定 """
#X-Y軸(1)グラフスタイル
style = graph_obj.series[0]
style.graphicalProperties.line.solidFill = "FF1493"   #グラフカラー
style.graphicalProperties.line.width = 40000          #グラフ幅
style.smooth = True                                   #グラフの線を滑らかにする

#X-Y軸(2)グラフスタイル
style2 = graph_obj.series[1]
style2.graphicalProperties.line.solidFill = "0000FF"  #グラフカラー
style2.graphicalProperties.line.width = 40000         #グラフ幅
style2.smooth = True                                  #グラフの線を滑らかにする

""" 03 グラフ配置 """
sheet.add_chart(graph_obj, "N3")

#保存
workbook.save(name)

グラフ作成におけるPythonコード解説

グラフ作成に用いたコードについて以下詳細解説します。

OPenPyXLにおけるReference()・DateAxis()関数

グラフはOpenPyXLにおけるReference()関数およびDateAxis()関数を用いて作成します。そのため、まず下記を読み込んでいます。

import openpyxl
from openpyxl.chart import Reference
from openpyxl.chart.axis import DateAxis

グラフオブジェクト作成:グラフ種類

今回の例では、グラフ種類が棒グラフおよび折線グラフであるオブジェクトを作成しました。

#棒グラフ
graph_obj = openpyxl.chart.BarChart()
#折線グラフ
graph_obj = openpyxl.chart.LineChart()

上記の種類以外にも散布図や円グラフ形式でグラフ作成できます。その場合、下記のようにコーディングします。

グラフ種類 Pythonコーディング
棒グラフ openpyxl.chart.BarChart()
折れ線グラフ openpyxl.chart.LineChart()
散布図 openpyxl.chart.ScatterChart()
円グラフ openpyxl.chart.PieChart()

グラフオブジェクト作成:グラフ書式設定

各グラフの書式設定は下記のように記載します。

タイトル

graph_obj.title  = "グラフのタイトルを記載" 

スタイル

グラフ背景色が設定できます。例えば「40であれば肌色」、「48であれば黒色」の背景色を指定できます。

graph_obj.style  = "1~48の数値を入力"

グラフ縦幅・横幅

graph_obj.height = 10          #高さ
graph_obj.width  = 15          #幅

Y軸ラベル

graph_obj.y_axis.title = "Y軸タイトルを記載する"

X軸ラベル

graph_obj.x_axis.title = "X軸タイトルを記載する"

X軸が日付を取り扱う際は、下記の表を参考に日付書式を指定します。

graph_obj.x_axis.number_format = '日付書式を指定する' 
graph_obj.x_axis.majorTimeUnit = "days"
日付書式* 出力(例:2021年12月13日)
d-mmm 12-Dec
yyyy/mm/dd 2021/12/13
yyyy-mm-dd 2021-12-13
yyyy-mm 2021-12
mm/dd 12/13
mm 12
dd 13

表(*): graph_obj.x_axis.number_formatにて指定する日付書式

データの範囲設定

グラフを格納している短形範囲をキーワード引数(シート名, min_col, min_row, max_col, max_row)で渡すことでデータの範囲設定を行います。ここで列はアルファベットではなく数値で渡し、開始番号は0ではなく1で渡すことに注意しましょう。また、開始番号が軸のタイトルに該当する場合、add_data()メソッドの引数title_from_dataをTrueとして渡します。

Y軸データ範囲の設定

#Y軸設定情報
Y_axis = Reference("シート名",
                   min_col = "Y軸データ列開始番号(例:A列→1、B列→2)",
                   min_row = "Y軸データ行開始番号(例:1行目→1、2行目→2)",
                   max_col = "Y軸データ列終了番号(例:A列→1、B列→2)",
                   max_row = "Y軸データ行終了番号(例:8行目→8、9行目→9)",
                  )
#Y軸反映
graph_obj.add_data(Y_axis, titles_from_data=True)

X軸データ範囲の設定

#X軸設定情報
X_axis = Reference("シート名",
                   min_col = "X軸データ列開始番号(例:A列→1、B列→2)",
                   min_row = "X軸データ行開始番号(例:1行目→1、2行目→2)",
                   max_col = "X軸データ列終了番号(例:A列→1、B列→2)",
                   max_row = "X軸データ行終了番号(例:8行目→8、9行目→9)",
                  )
#X軸反映
graph_obj.set_categories(X_axis)

グラフのスタイル詳細設定

グラフのスタイル詳細設定は、Referenceオブジェクトを渡した後、表示するグラフの数に応じてSeriesオブジェクトを作成することでグラフ毎にスタイル設定できるようになります。

(例)グラフを2つ作成する場合、下記のようにオブジェクトを作成

#Seriesオブジェクト1
style = graph_obj.series[0]

#Seriesオブジェクト2
style2 = graph_obj.series[1]

グラフカラー

style.graphicalProperties.line.solidFill = "グラフ線のカラーを指定"

グラフの幅

style.graphicalProperties.line.width = 40000    #グラフ幅を指定

折線グラフを滑らかな曲線で表示

style.smooth = True 

グラフの配置場所設定

Excelシート上におけるグラフの配置場所は、以下のように指定します。

sheet.add_chart(graph_obj, "N3") #(オブジェクト, 配置場所)

Excel×Pythonの自動化手法まとめ

本記事をご覧いただきありがとうございました!本記事ではExcel操作の自動化に役立つノウハウを多数配信しています。これからExcel作業の自動化に取り組みたい方向けには下記の記事が参考になるかと思います。是非ご覧ください!

PythonによるExcel自動操作を学習する上でのおすすめ教材もご紹介しています。

最後に

この記事が気に入ったら
フォローしてね!

本記事をシェア!
URLをコピーする
URLをコピーしました!
目次
閉じる