はじめに:openpyxlでExcelグラフ作成を自動化しよう
この記事は、Pythonのopenpyxlライブラリを使って、Excelのグラフ作成を自動化したいと考えているあなたのために書きました。
毎月のレポート作成で、同じようなグラフを手作業で作るのにうんざりしていませんか? openpyxlを使えば、その面倒な作業をPythonプログラムに任せることができます。
本記事では、グラフの見栄えを細かく制御するための鍵となるSeries(シリーズ)オブジェクトに焦点を当て、その役割から応用的な使い方まで、具体的なサンプルコードと共に徹底的に解説します。
この記事を読み終える頃には、あなたはopenpyxlで思い通りのグラフを自在に描くテクニックを身につけ、日々のExcel作業を大幅に効率化できるようになるでしょう。
openpyxlにおけるグラフ作成の基本要素
まず、openpyxlでグラフを作成するには、3つの重要な部品(オブジェクト)の連携が必要です。
結論から言うと、**Chart(グラフ全体)、Reference(データの範囲)、Series(データ系列の詳細設定)**の3つを組み合わせてグラフを構築します。
Chartオブジェクト: グラフの種類を決めます。- 「これは棒グラフです」「これは折れ線グラフです」といった、グラフ全体の形式を定義する大枠の役割を担います。
BarChart,LineChart,PieChartなどがあります。
- 「これは棒グラフです」「これは折れ線グラフです」といった、グラフ全体の形式を定義する大枠の役割を担います。
Referenceオブジェクト: グラフに使うExcelセルの範囲を指定します。- 「グラフのデータはA2セルからA10セルまでです」のように、どのデータをグラフにするかをExcelシート上で指定する役割です。
Seriesオブジェクト: 個々のデータ系列の見た目や設定を定義します。- グラフの凡例名、線の色、マーカーの形といった、グラフの表現力を高めるための詳細な設定を行います。この記事の主役です。
この3つは、「どんな種類のグラフ(Chart)に、どの範囲のデータ(Reference)を、どんな見た目(Series)で描画するか」という関係性で成り立っています。この関係性を理解することが、グラフ作成自動化の第一歩です。
Seriesオブジェクトの役割と重要性
Seriesとは、グラフを構成する一つ一つのデータ系列を表現するオブジェクトです。
なぜSeriesが重要なのでしょうか?それは、Referenceだけでは実現できない、グラフの細かなカスタマイズを可能にするからです。
例えば、以下のような設定はSeriesオブジェクトがなければ実現できません。
- 凡例のカスタマイズ:
Referenceだけでも凡例は表示できますが、Seriesを使えば、セル範囲とは別に「2025年度売上」のような任意のテキストを凡例として設定できます。 - データラベルの追加: 各棒グラフの上や、折れ線グラフの点に具体的な数値を表示できます。
- グラフの見た目の調整:
- 折れ線グラフの線の色、太さ、種類(点線など)を変更する。
- グラフの点の形(マーカー)を丸や四角に変更する。
- 棒グラフの塗りつぶし色を変更する。
このように、Seriesは単にデータをプロットするだけでなく、そのグラフを「伝わる資料」にするための化粧を施す役割を担っています。Seriesを使いこなすことこそが、openpyxlによるグラフ作成をマスターする鍵なのです。
実践!Seriesを使ったグラフ作成のステップ
それでは、実際にSeriesを使って棒グラフを作成する手順をステップバイステップで見ていきましょう。
ステップ1: 環境準備とライブラリのインポート
最初に、openpyxlライブラリをインストールし、必要なモジュールをインポートします。
まだインストールしていない場合は、ターミナルやコマンドプロンプトで以下のコマンドを実行してください。
pip install openpyxlそして、Pythonスクリプトの冒頭で、必要なクラスをインポートします。
import openpyxl
from openpyxl.chart import BarChart, Reference, Series
# このバージョンで動作確認しています
print(f"openpyxlのバージョン: {openpyxl.__version__}")
# >> openpyxlのバージョン: 3.1.2ステップ2: Excelファイルの準備とデータの読み込み
次に、グラフの元となるデータを持つExcelファイルを作成します。
ここでは、新しいWorkbookを作成し、簡単なサンプルデータを書き込んでみましょう。
# 1. 新しいExcelワークブックを作成
wb = openpyxl.Workbook()
ws = wb.active
ws.title = "月別売上レポート"
# 2. グラフの元になるサンプルデータを書き込む
rows = [
["月", "商品A売上", "商品B売上"],
["1月", 150, 90],
["2月", 200, 110],
["3月", 220, 150],
["4月", 180, 130],
["5月", 250, 180],
["6月", 300, 210],
]
for row in rows:
ws.append(row)ステップ3: Chartオブジェクトの作成
グラフの種類を決め、Chartオブジェクトを作成します。今回は棒グラフを作成するのでBarChartを使います。
# 3. グラフオブジェクトを作成 (今回は棒グラフ)
chart = BarChart()
chart.title = "月別 商品売上"
chart.x_axis.title = "月"
chart.y_axis.title = "売上(万円)"ステップ4: Referenceでデータ範囲を指定
グラフにするデータの範囲をReferenceオブジェクトで指定します。
カテゴリ(横軸)と値(縦軸)の範囲をそれぞれ定義します。
# 4. グラフのデータ範囲をReferenceで指定
# カテゴリ軸のデータ範囲 (A2セルからA7セルまで)
# min_col=1, max_col=1 はA列を指す
categories = Reference(ws, min_col=1, min_row=2, max_row=7)
# 値のデータ範囲 (B2セルからB7セルまで)
# min_col=2, max_col=2 はB列を指す
values = Reference(ws, min_col=2, min_row=2, max_row=7)ステップ5: Seriesでデータ系列を定義【ここが本題】
いよいよSeriesの登場です。Referenceで指定した値の範囲を使ってSeriesオブジェクトを作成します。
SeriesのコンストラクタにReferenceオブジェクトを渡すのが基本です。凡例(系列名)はB1セルの値を使うように設定してみましょう。
# 5. Seriesオブジェクトを作成
# valuesに値の範囲(Reference)を、title_from_dataで凡例の自動取得を設定
series = Series(values=values, title_from_data=True)title_from_data=Trueとすると、openpyxlは指定したデータ範囲(values)のすぐ上の行(この場合は1行目)を自動的に凡例名として解釈してくれるため便利です。
ステップ6: グラフにSeriesとカテゴリを追加
作成したSeriesとカテゴリをChartオブジェクトに追加します。
データ系列はchart.append()で、カテゴリ軸はchart.set_categories()で設定します。
# 6. グラフにSeriesとカテゴリを追加
chart.append(series)
chart.set_categories(categories)ステップ7: ワークシートにグラフを配置
最後に、完成したグラフをワークシートのどの位置に配置するかを指定し、ファイルを保存します。
# 7. ワークシートにグラフを追加し、ファイルを保存
# E2セルを左上としてグラフを配置
ws.add_chart(chart, "E2")
# ファイルを保存
wb.save("sample_chart_with_series.xlsx")
print("グラフ付きのExcelファイルを保存しました。")ここまでのコードを実行すると、sample_chart_with_series.xlsxというファイルが生成され、きれいな棒グラフが描画されているはずです。
Seriesを使いこなす応用テクニック
基本がわかったところで、Seriesを使ったさらに便利なテクニックを見ていきましょう。
複数のデータ系列を持つグラフを作成する
商品Aと商品Bの売上を比較するような、複数のデータ系列を持つグラフも簡単に作成できます。
やることは単純で、データ系列の数だけReferenceとSeriesを作成し、chart.append()で追加するだけです。
# ... (ステップ3までのコードは同じ) ...
# 4. データ範囲を複数指定
categories = Reference(ws, min_col=1, min_row=2, max_row=7)
# 商品Aのデータ (B列)
values_A = Reference(ws, min_col=2, min_row=1, max_row=7)
# 商品Bのデータ (C列)
values_B = Reference(ws, min_col=3, min_row=1, max_row=7)
# 5. Seriesをデータ系列の数だけ作成
# openpyxlはmin_row=1から指定すると、自動で1行目を凡例、2行目以降をデータと認識する
series_A = Series(values=values_A, title_from_data=True)
series_B = Series(values=values_B, title_from_data=True)
# 6. グラフに複数のSeriesを追加
chart.append(series_A)
chart.append(series_B)
chart.set_categories(categories)
# ... (ステップ7のコードは同じ) ...
# ファイルを保存
# wb.save("multiple_series_chart.xlsx")グラフの見た目をカスタマイズする
Seriesのプロパティを操作することで、グラフの見た目をより詳細にカスタマイズできます。
例えば、商品Bの棒グラフの色をオレンジ色に変えてみましょう。graphicalPropertiesを使います。
from openpyxl.drawing.fill import SolidColorFillProperties
# ... (上記の複数系列のコードの続き) ...
# series_B (商品B) の色を変更する
# SolidColorFillPropertiesで色を指定 (RGBで指定)
fill = SolidColorFillProperties(prstClr="orange")
series_B.graphicalProperties.solidFill = fill
# ... (グラフに追加して保存) ...折れ線グラフの場合は、マーカー(点)の形や線のスタイルも変更できます。
from openpyxl.chart.marker import Marker
# series_Bが折れ線グラフの場合
# マーカーを四角に設定
series_B.marker = Marker('square')
# 線を点線に設定
series_B.graphicalProperties.line.dashStyle = "dash"第二軸(2軸グラフ)を追加する
売上(棒グラフ)と達成率(折れ線グラフ)のように、単位が異なるデータを一緒に表示したい場合は、第二軸(2軸グラフ)を使います。
openpyxlでも、新しい軸を作成し、特定のSeriesをそちらに割り当てることで2軸グラフを実現できます。
from openpyxl.chart import LineChart
from openpyxl.chart.axis import ChartLines
# ... (基本のグラフ作成コードの続き) ...
# 1. 第二のY軸を持つ折れ線グラフを作成
line_chart = LineChart()
# 2. 第二軸用のデータ範囲とSeriesを作成
# (例としてD列に達成率データがあると仮定)
values_rate = Reference(ws, min_col=4, min_row=1, max_row=7)
series_rate = Series(values=values_rate, title_from_data=True)
line_chart.append(series_rate)
# 3. 既存の棒グラフ (chart) に折れ線グラフを重ねる
chart.y_axis.crossAx = 500 # Y軸の交点設定 (例)
chart += line_chart # グラフを結合
# ... (カテゴリ設定と保存) ...※第二軸の設定はopenpyxlのバージョンによって挙動が異なる場合があるため、公式ドキュメントも合わせてご確認ください。
まとめ:Seriesを制してopenpyxlのグラフ描画をマスターしよう
今回は、Pythonのopenpyxlライブラリにおけるグラフ作成の心臓部、Seriesオブジェクトについて徹底的に解説しました。
- グラフ作成の基本:
Chart,Reference,Seriesの3つのオブジェクトを連携させてグラフを作る。 Seriesの役割: 凡例、色、マーカー、線のスタイルなど、グラフの見た目を詳細に設定する重要な役割を担う。- 基本的な流れ:
Referenceでデータ範囲を指定し、それを元にSeriesを作成し、Chartにappendするのが一連の流れ。 - 応用テクニック: 複数の
Seriesを追加して多系列グラフを、プロパティを操作して見た目をカスタマイズし、グラフを組み合わせることで2軸グラフも作成できる。
Seriesを自在に操れるようになれば、手作業では時間のかかる複雑で見栄えの良いグラフも、Pythonスクリプトを実行するだけで一瞬で生成できるようになります。
ぜひ本記事のコードを参考に、あなたのExcel業務自動化に挑戦してみてください。


コメント