送られてきたデータで折れ線グラフを作りたいんだけど、
毎日毎日作るのがめんどう…。
openpyxlを使って楽に折れ線グラフを作る方法は無いの?
あります!
比較的簡単にできる方法を紹介いたします!
「複数の折れ線グラフ」や「列と行が逆の場合の対処法」も解説いたします!
【著者情報】
Python歴3年。
入社2年目の春に先輩が突然トンズラし、業務を半分肩代わりするハメに…。
今までの1.5倍の仕事をこなせるはずもなく、苦しむ毎日。
業務効率化を模索中にPythonと出合う。
業務とPythonの相性が良く、2倍以上の効率化を実現。現在も効率化を進行中。
openpyxlで折れ線グラフを作成するには
「chart(LineChart)」を使います。まずは実行見本をどうぞ。
実行見本
全コード
まずは実績のみの折れ線グラフを作ってみましょう。
ひとまず全コードを網羅しますが、解説は後ほど行います。
import openpyxl
from openpyxl.chart import LineChart, Reference
wb = openpyxl.load_workbook('input.xlsx')
ws = wb['Sheet1']
date = Reference(ws, min_col=1, min_row=2, max_col=1, max_row=13)
jisseki = Reference(ws, min_col=2, min_row=2, max_col=2, max_row=13)
chart = LineChart()
chart.add_data(jisseki)
chart.set_categories(date)
ws.add_chart(chart, 'E1')
wb.save('input.xlsx')
事前準備
- openpyxlのインストール
既存のエクセルファイルを編集するには「openpyxl」のインストールが必要です。
openpyxlのインストール方法
openpyxlを初めて使用する場合は、下記コードを入力・実行して、インストールしてください。
pip install openpyxl
※openpyxlを使用したことがある場合は、このインストール作業は不要です。
openpyxlの基礎解説
既存ファイルを開いて保存する方法などの操作の基本解説は、下記記事で行っております。
ご参考ください。
解説
※わかりやすさを重視しております。厳密には解釈が異なる場合がありますことをご了承ください。
インポート
import openpyxl
from openpyxl.chart import LineChart, Reference
上記記述をすることで、折れ線グラフ作成に必要な「chart」などをインポートすることができます。
データの取得
date = Reference(ws, min_col=1, min_row=2, max_col=1, max_row=13)
jisseki = Reference(ws, min_col=2, min_row=2, max_col=2, max_row=13)
まずは、折れ線グラフを作成するためのデータを取得して、変数に代入します。
取得するのは、A列の「年月」とB列の「実績」です。
「年月」はエクセルの「A2~A13」セルを取得します。
「実績」は「B2~B13」です。
データ取得の詳細は下記記事でわかりやすく解説しております。ご参考ください。
グラフを作成
chart = LineChart()
chart.add_data(jisseki)
chart.set_categories(date)
ws.add_chart(chart, 'E1')
上記記述をすることで、前項で取得したデータを元に折れ線グラフを作成することができます。
1つ1つ解説していきましょう。
chart = LineChart()
上記一文にて、グラフの種類(折れ線グラフ)をひとまず変数「chart」に代入します。
chart.add_data(jisseki)
chart.set_categories(date)
11行目:取得した実績列のデータ「jisseki」を「add_data」で変数「chart」に追加
12行目:取得した年月列のデータ「date」を「set_categories」を使いカテゴリに登録
ws.add_chart(chart, 'E1')
上記記述は、グラフを作る位置を指定しています。
‘E1’はエクセル内の「E1セル」を指すため、
上記コードでは、「E1セル」にグラフを作成することができます。
以上で上図見本のような折れ線グラフを作成することができます。
今回はわかりやすく「date」や「jisseki」のような変数名にしましたが、
通常は「category」や「data」のような名前にすると、汎用性が高くなります。
複数の折れ線グラフを作成するには
次に、複数のデータ(実績と目標)を比較できる折れ線グラフを作ってみましょう。
import openpyxl
from openpyxl.chart import LineChart, Reference
wb = openpyxl.load_workbook('input.xlsx')
ws = wb['Sheet1']
date = Reference(ws, min_col=1, min_row=2, max_col=1, max_row=13)
jisseki = Reference(ws, min_col=2, min_row=1, max_col=2, max_row=13)
mokuhyou = Reference(ws, min_col=3, min_row=1, max_col=3, max_row=13)
chart = LineChart()
chart.add_data(jisseki, titles_from_data=True)
chart.add_data(mokuhyou, titles_from_data=True)
chart.set_categories(date)
ws.add_chart(chart, 'E1')
wb.save('input.xlsx')
実績のみの折れ線グラフから追加・変更されている部分のみ解説いたします。
jisseki = Reference(ws, min_col=2, min_row=1, max_col=2, max_row=13)
mokuhyou = Reference(ws, min_col=3, min_row=1, max_col=3, max_row=13)
「jisseki」の取得ですが、「min_row=2」から「min_row=1」に変更しています。
これは、タイトルであるB1セルの「実績」も含めるためです。
最終的に2つの折れ線グラフが表示されるため、どっちが実績のグラフでどっちが目標のグラフなのかをわかるようにしています。
目標列も実績列と同様、1行目からデータを取得します。
chart.add_data(jisseki, titles_from_data=True)
chart.add_data(mokuhyou, titles_from_data=True)
add_dataの()内に何やら追加されています。
「titles_from_data=True」は、「取得したデータ内にタイトルが含まれていますよ!」という指示です。
1行目の「実績」や「目標」を含んでデータを取得しているため、この記述が必要です。
これを記述しなかった場合、取得したB1セルの「実績」が、タイトルではなくB2~B13と同様のデータと勘違いされてしまいます。
実績列と同様に目標列も「add_data」でグラフに追加します。
以上で複数データを比較するグラフが作成できます。
3つや4つの折れ線グラフも、今回と同様の書き方で作成することができます。
列と行が逆の場合の対処法
下図のように列と行が逆にまとまられたデータの場合、これまでのやり方ではグラフを作ることができません。
ひと工夫が必要なのですが、作り方を見ていきましょう。
ひとまず全コードを網羅します。
import openpyxl
from openpyxl.chart import LineChart, Reference
wb = openpyxl.load_workbook('input.xlsx')
ws = wb['Sheet1']
date = Reference(ws, min_col=2, min_row=1, max_col=13, max_row=1)
jisseki = Reference(ws, min_col=1, min_row=2, max_col=13, max_row=2)
mokuhyou = Reference(ws, min_col=1, min_row=3, max_col=13, max_row=3)
chart = LineChart()
chart.add_data(jisseki, from_rows=True, titles_from_data=True)
chart.add_data(mokuhyou, from_rows=True, titles_from_data=True)
chart.set_categories(date)
ws.add_chart(chart, 'A5')
wb.save('input.xlsx')
7~9行目でデータ取得の位置を変えるのはもちろんなのですが、
「add_data」でデータを追加する際、「from_rows=True」を追記してください。
chart.add_data(jisseki, from_rows=True, titles_from_data=True)
chart.add_data(mokuhyou, from_rows=True, titles_from_data=True)
これは「行方向にまとめられたデータを有効にする」というもので、
これを記述しないと、うまくグラフが出来ません。ご注意ください。
うまく動作しない時
エラーが出る
No such file or directory: ○○
これは、読み込むファイルやフォルダが見つからないというエラーです。
読み込むファイルのファイル名と構文のファイル名が一致しているか確認しましょう。
詳しい解説は、下記記事をご参考ください。
Permission denied: ○○
操作しようとしているファイルにアクセスできないというエラーです。
「ファイルを開いている状態なので編集できない」と言っていることが多いので、開いていれば閉じて再度トライしましょう。
詳しい解説は、下記記事をご参考ください。
Worksheet ○○ does not exist
「指定したシートがありません」というエラーです。
指定のシート名が間違っていないか、「sheet1」など先頭が小文字になっていないか確認しましょう。
詳しい解説は、下記記事をご参考ください。
○○ is not defined
今まで出てきていない変数などを処理しようとした時に出るエラーです。
変数名などが間違っていないかチェックしましょう。
詳しい解説は、下記記事をご参考ください。
その他のエラー
その他のエラーが出た場合は、エラー文をコピーしてNETで検索してみましょう。
最後に
openpyxlで折れ線グラフを作成する方法を解説いたしました。
折れ線グラフの作成には「chart(LineChart)」を使うということを頭の片隅に置いておいてください。
当ブログでは、Pythonに関する情報を配信しております。
この記事がわかりやすいと感じた方は、他の記事も読んでいってください。
最後までお読みいただき、ありがとうございました。がんばってください!