PythonのExcelグラフはめちゃめちゃ癖が強かったというお話
私は毎年読書の記録をスプレッドシートでつけています。
年末には集計して読了数、購入媒体、ジャンルなどをグラフ出力しているのですが、Pythonでグラフのひな形を書いておいて出力したら楽かな?と思い立ち、PythonのExcelグラフ出力を試みてみました。
とりあえずラフにデータを書き込んで出力させてみたのですが、どういうわけか3つ項目があるうちの2項目までしかグラフに反映されず詰まってしまいました。
テスト用にラフに作ったExcelの元データ(2024read.xlsx)
パイチャートを出力させるために書いたコード
※openpyxlライブラリをインストールする必要があります
import openpyxl
from openpyxl.chart import PieChart, Reference
from openpyxl.chart.series import DataPoint
wb = openpyxl.load_workbook("2024read.xlsx")
sh = wb["label2"]
data = Reference(sh, min_col=2,min_row=1, max_row=sh.max_row)
labels = Reference(sh, min_col=1,min_row=1, max_row=sh.max_row)
print(labels)
print(data)
chart = PieChart()
chart.title = "ラベル別"
chart.add_data(data, titles_from_data=True)
chart.set_categories(labels)
sh.add_chart(chart, "H23")
wb.save("2024read.xlsx")
最後のデータが反映されない問題
残念ながらtのデータが反映されていません。
データ指定の肝になっている部分はここ
data = Reference(sh, min_col=2,min_row=1, max_row=sh.max_row)
labels = Reference(sh, min_col=1,min_row=1, max_row=sh.max_row)
もしかしてmax_row+1で行ける?と思い以下のコードで実行
data = Reference(sh, min_col=2,min_row=1, max_row=sh.max_row+1)
labels = Reference(sh, min_col=1,min_row=1, max_row=sh.max_row+1)
あと、空欄の4行目までが選択範囲になってしまうのでダメですね。
それにしても進歩したのは「ラベルは全部反映されている」という点です
グラフデータは2行目までしか読み込んでくれない(選択行の-2まで読んでいる)
が、ラベルは3行目まで読んでくれた(選択行の-1まで読んでいる)
!!!
読み込みの先頭行が設定(min_row)の一個前になっているのではないか?
というわけで-1行目を挿入することを思いつきました。
(実際には見出し行でデータの前に一行挿入されているのが普通のExcelデータです)
見出し行的に1行挿入
ここで気を付けないといけないのは、ラベルは選択行の-1まで読んでいるけれど、データは選択行の-2までしか読んでいないという点です。
ここに気を付けて先頭行を調整します。
先頭行調整後のコード
data = Reference(sh, min_col=2,min_row=1, max_row=sh.max_row)
labels = Reference(sh, min_col=1,min_row=2, max_row=sh.max_row) #min_rowの設定変更
今度はちゃんと出力されました!めでたしめでたし✨
まとめ
実際、見出し行を入れる解決策に思い至るまで3日間も詰まっていました。
Excelの書き方の問題ではなく、コードの方に問題があると思っていたのです。
それにしてもopenpyxlのラベル(凡例)とデータの取り方が違うという癖は気づくまで本当に厄介でした。