PythonでExcel操作:棒グラフを追加する

勉強系(Python/Excel/統計学/その他)

全体まとめページは↓より。

やりたいこと

・以下のようなデータを読み込んで、2系列の棒グラフを作成してシート上に配置し保存する。

フォルダ構成

VSCodeで実行するときはprg配下を開いてpyファイルを作り実行する。

実装

import os
import openpyxl
from openpyxl.chart import BarChart, Series, Reference

#辞書リストの作成関数
def make_shipment(sh):
    shipment_list = []
    for row in sh.iter_rows():
        if row[0].row == 1:
            header_cells = row
        else:
            row_dic = {}
            for v, k in zip(header_cells, row):
                row_dic[v.value] = k.value
            shipment_list.append(row_dic)
    return shipment_list

#ファイル名を入力させる
print("ファイル名を入力:")
filename = input()

#読み込みファイルパスを作成
infile_path = os.path.join("..\indata" , filename)

#読み込みファイルからオブジェクトを生成
iwb = openpyxl.load_workbook(infile_path)
ish = iwb.active

#出力ファイルパスを作成
outfile_path = os.path.join("..\outdata" , filename)

#辞書リストを作成
shipment_list = make_shipment(ish)

#★グラフオブジェクトを作成してグラフの外側の情報を指定する
chart1 = BarChart()
chart1.type = "col"
chart1.style = 10 #棒を少し縁取る
chart1.title = "棒グラフ"
chart1.y_axis.title = '縦軸タイトル'
chart1.x_axis.title = '横軸タイトル'

#A列がインデックスである前提で、max_rowの指定用変数mrを作る
row = 1
mr = 1
while(ish.cell(row,1).value is not None):
    row += 1
mr = row - 1

#グラフ本体を作成してシート上に配置する
#min_colは指定必須、複数系列を扱うときはmax_colで範囲を指定
data = Reference(ish, min_col=2, max_col=3, min_row=1, max_row=mr)
cats = Reference(ish, min_col=1, min_row=2, max_row=mr) #ラベルカテゴリを指定する。1列なのでmax_colは指定しない
chart1.add_data(data, titles_from_data=True)
chart1.set_categories(cats)
ish.add_chart(chart1, "A10")

iwb.save(outfile_path)

※本内容ではishオブジェクトからデータを取り込んでおり、辞書データは特に使用していない。
(複合的なデータの取り扱いを考えると辞書データを使うほうが良いと思われるので、今後改善予定)

出力結果

ベーシックなレイアウトで2系列の棒グラフが作成され、出力ファイルのシート上に配置されている。

指針(運用イメージ)

今回はシートの読み込みからグラフの作成までのみ行ったが、今後の運用を見据えて全体的な流れは
・データシートから使用する列を抜粋し、別シートに転記
・転記シートにてグラフを作成
・出力ファイルとして保存
を想定する。(ほかの部分は別ページにて追加予定)

以上

タイトルとURLをコピーしました