こんにちは、DXCEL WAVEの運営者(@dxcelwave)です!
- PythonとOpenPyXLを活用したExcel操作に興味がある
- PythonでExcelを操作してグラフを作成する方法が知りたい
- Pythonでグラフをデザイン(グラフの種類・軸ラベル・スタイル設定等)したい
【Python×Excel】OpenPyXLを活用したグラフ作成|全体像
本記事では、PythonからExcelファイルを操作し、Excelファイル上にグラフを作成する方法について解説します。
【Excel×Python】作業効率化の学習におすすめな入門本・動画教材8選
「Excel作業をプログラミング言語Pythonを用いて自動化したい!」「どの教材で勉強すれば良いの?」本記事ではこのような疑問にお応えします。
グラフ完成イメージ
上図のようなアウトプット出力するのが本記事のゴールになります。後述で解説するポイントは以下です。
- 棒グラフの作成する点
- 2つの変数を比較した折線グラフの作成する点
上記を作成する中で、本記事では「多様な種類のグラフの作成方法」や「スタイル設定」などグラフ設定に関わる点は徹底解説しています。是非ご覧ください。
Excel操作によるグラフ作成とPythonプログラミング手順
下記の手順に従い、Pythonプログラミングを実施します。
- グラフ作成用のデータ準備
- Excelファイル新規作成
- Excel上にデータ書き込み
- グラフ作成
【事前準備】Pythonライブラリ「OpenPyXL」をインストール
PythonによるExcel操作では、OpenPyXLというモジュールを用います。下記コマンドをもとに事前にインストールしておきましょう。
pip install openpyxl
【実践1】Pythonでエクセルグラフ作成用のデータ準備
それではここからプログラミング解説に移ります。まず、グラフ作成に用いるデータを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))
【実践2】PythonでExcelファイルを新規作成する
カレントディレクトリにExcelファイルを新規作成します。下記コードを実行します。
#モジュール読込
import openpyxl
#ファイル名
name = "グラフ作成.xlsx"
#Excelワークブック・シート作成
workbook = openpyxl.Workbook(name)
sheet = workbook.create_sheet(index=0)
#保存
workbook.save(name)
今回は内容割愛しますが、PythonによるExcelファイルの作成方法について詳しく知りたい方はこちらの記事もご覧ください。
PythonでのExcelファイル作成・読込方法
「PythonでExcelファイル・シートをどのように作成するの?」本記事ではこの疑問に答えます。Excel操作の自動化を検討するにあたり、初期段階で必要なExcel Workbook/Sheet作成のプログラミング方法を習得しましょう!
【実践3】PythonからExcelファイルに対してデータ書き込み
Python実行環境上に読み込んだデータをExcelファイル上に書き込みます。下記2パターンのコードのうち、どちらかを実行しましょう。
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)
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]のまま利用いただいて問題ありません。
【実践4】Excelファイル上にグラフを描画
続いて、グラフの作成方法です。上図のように「①単純な棒グラフ」および「②複数データを比較した折線グラフ」の作成方法に分けて解説します。
①単純な棒グラフ
下記にコードを全量示します。コードの詳細は、下記「グラフ作成における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×Excelグラフ作成における詳細解説・デザイン初期設定編
グラフ作成に用いたコードについて以下詳細解説します。
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") #(オブジェクト, 配置場所)
【参考】Pythonで面倒な作業を自動化!手法一挙公開中!
当サイトでは日々面倒な作業をPythonで自動化する方法を多数配信しております。日々の作業が飛躍的効率化できること間違いなしですので、以下気になった記事があれば併せてご覧ください。
【面倒なタスクをPythonで解決!】作業効率化の人気記事一覧
【参考】Pythonとは?・実現できること
最後に
お問い合わせフォーム
上記課題に向けてご気軽にご相談下さい。
お問い合わせはこちら