エクセルにまとめられたデータで積み上げ棒グラフを作りたい…。
毎日のことだから、毎回作るのはめんどうなんだけど、
openpyxlを使って積み上げ棒グラフを作る方法は無いの?
あります!
比較的簡単にできる方法を紹介いたします!
「列と行が逆の場合の対処法」も解説いたします!
【著者情報】
Python歴3年。
入社2年目の春に先輩が突然トンズラし、業務を半分肩代わりするハメに…。
今までの1.5倍の仕事をこなせるはずもなく、苦しむ毎日。
業務効率化を模索中にPythonと出合う。
業務とPythonの相性が良く、2倍以上の効率化を実現。現在も効率化を進行中。
openpyxlで積み上げ棒グラフを作成するには
「chart(BarChart)」を使います。まずは実行見本をどうぞ。
実行見本
全コード
まずは単独の棒グラフを作ってみましょう。
ひとまず全コードを網羅しますが、解説は後ほど行います。
import openpyxl
from openpyxl.chart import BarChart, 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)
item_a = Reference(ws, min_col=2, min_row=2, max_col=2, max_row=13)
chart = BarChart()
chart.add_data(item_a)
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 BarChart, Reference
上記記述をすることで、棒グラフ作成に必要な「chart」などをインポートすることができます。
データの取得
date = Reference(ws, min_col=1, min_row=2, max_col=1, max_row=13)
item_a = Reference(ws, min_col=2, min_row=2, max_col=2, max_row=13)
まずは、棒グラフを作成するためのデータを取得して、変数に代入します。
取得するのは、A列の「年月」とB列の「商品A」です。
「年月」はエクセルの「A2~A13」セルを取得します。
「商品A」は「B2~B13」です。
データ取得の詳細は下記記事でわかりやすく解説しております。ご参考ください。
グラフを作成
chart = BarChart()
chart.add_data(item_a)
chart.set_categories(date)
ws.add_chart(chart, 'E1')
上記記述をすることで、前項で取得したデータを元に棒グラフを作成することができます。
1つ1つ解説していきましょう。
chart = BarChart()
上記一文にて、グラフの種類(棒グラフ)をひとまず変数「chart」に代入します。
chart.add_data(item_a)
chart.set_categories(date)
12行目:取得した商品A列のデータ「item_a」を「add_data」で変数「chart」に追加
13行目:取得した年月列のデータ「date」を「set_categories」を使い「chart」のカテゴリに登録
ws.add_chart(chart, 'E1')
上記記述は、グラフを作る位置を指定しています。
‘E1’はエクセル内の「E1セル」を指すため、
上記コードでは、wsの「E1セル」にグラフを作成することができます。
【 ワークシートを代入した変数.add_chart(グラフを代入した変数, ‘グラフを作成したい位置のセル名’) 】
以上で上図見本のような棒グラフを作成することができます。
今回はわかりやすく「date」や「item_a」のような変数名にしましたが、
通常は「category」や「data_a」のような名前にすると、汎用性が高くなります。
積み上げ棒グラフを作成する
次に、積み上げ棒グラフを作ってみましょう。
import openpyxl
from openpyxl.chart import BarChart, 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)
item_a = Reference(ws, min_col=2, min_row=1, max_col=2, max_row=13)
item_b = Reference(ws, min_col=3, min_row=1, max_col=3, max_row=13)
chart = BarChart()
chart.grouping = 'stacked'
chart.overlap = 100
chart.add_data(item_a, titles_from_data=True)
chart.add_data(item_b, titles_from_data=True)
chart.set_categories(date)
ws.add_chart(chart, 'E1')
wb.save('input.xlsx')
単独の棒グラフから追加・変更されている部分のみ解説いたします。
item_a = Reference(ws, min_col=2, min_row=1, max_col=2, max_row=13)
item_b = Reference(ws, min_col=3, min_row=1, max_col=3, max_row=13)
「商品A」の取得ですが、「min_row=2」から「min_row=1」に変更しています。
これは、タイトルであるB1セルの「商品A」も含めるためです。
最終的に2つの棒グラフが表示されるため、どっちが商品Aのグラフでどっちが商品Bのグラフなのかをわかるようにしています。
商品B列も商品A列と同様、1行目からデータを取得します。
item_b = Reference(ws, min_col=3, min_row=1, max_col=3, max_row=13)
chart.grouping = 'stacked'
chart.overlap = 100
積み上げ棒グラフを作成するには、上記2行の記述が必要です。
12行目は棒グラフを積み上げ式にするというもので、
13行目は棒グラフの位置を調整する記述です。
どちらも記述しないと、下図のような並列の棒グラフになってしまいます。
また、12行目だけの記述では、下図のような棒がズレたグラフが出来上がってしまいます。
chart.add_data(item_a, titles_from_data=True)
chart.add_data(item_b, titles_from_data=True)
add_dataの()内に何やら追加されています。
「titles_from_data=True」は、「取得したデータ内にタイトルが含まれていますよ!」という指示です。
エクセル1行目の「商品A」や「商品B」を含んでデータを取得しているため、この記述が必要です。
これを記述しなかった場合、取得したB1セルの「商品A」が、タイトルではなくB2~B13と同様のデータと勘違いされてしまいます。
商品A列と同様に商品B列も「add_data」でグラフに追加します。
以上で積み上げ棒グラフの完成です。お疲れさまでした。
3つや4つの積み上げ棒グラフも、今回と同様の書き方で作成することができます。
列と行が逆の場合の対処法
下図のように列と行が逆にまとめられたデータの場合、これまでのやり方ではグラフを作ることができません。
ひと工夫が必要なのですが、作り方を見ていきましょう。
ひとまず全コードを網羅します。
import openpyxl
from openpyxl.chart import BarChart, 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)
item_a = Reference(ws, min_col=1, min_row=2, max_col=13, max_row=2)
item_b = Reference(ws, min_col=1, min_row=3, max_col=13, max_row=3)
chart = BarChart()
chart.grouping = 'stacked'
chart.overlap = 100
chart.add_data(item_a, from_rows=True, titles_from_data=True)
chart.add_data(item_b, 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(item_a, from_rows=True, titles_from_data=True)
chart.add_data(item_b, 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(BarChart)」を使うということを頭の片隅に置いておいてください。
当ブログでは、Pythonに関する情報を配信しております。
この記事がわかりやすいと感じた方は、他の記事も読んでいってください。
最後までお読みいただき、ありがとうございました。がんばってください!