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