openpyxlのChartContainerとは?基本的な使い方から複数グラフの作成までを徹底解説

openpyxl

Pythonを使ってExcel操作を自動化できるライブラリopenpyxl。データ処理やレポート作成に活用している方も多いのではないでしょうか。基本的なグラフを1つ作成するのは簡単ですが、「複数のグラフを1つのシートに並べて表示したい」「グラフのレイアウトをきれいに整えたい」と思った途端、コードが複雑になり、思い通りにいかずに悩んでいませんか?

実は、openpyxlにはそんな悩みを解決するための強力な機能、ChartContainerが用意されています。

この記事を読めば、以下のことができるようになります。

  • ChartContainerの役割と基本的な仕組みがわかる
  • 複数のグラフを1つのシート上に自在に配置・レイアウトできるようになる
  • Excelレポート作成の自動化がさらにレベルアップする

これまで手作業でグラフの位置を調整していた方も、この記事を最後まで読めば、プログラムですっきりと複数のグラフを配置する方法をマスターできます。ぜひ、この機会にChartContainerを使いこなしてみましょう。

openpyxlのChartContainerとは?

ChartContainerを一言で説明するなら、**複数のグラフをまとめて管理するための「入れ物(コンテナ)」**です。

openpyxlでグラフを作成する際、BarChartLineChartといったChartオブジェクトを使いますが、これはあくまで単体のグラフそのものです。ChartContainerは、それらのChartオブジェクトを複数格納し、シート上のどの範囲に、どのようなレイアウトで配置するかを定義する役割を担います。

これを使うことで、単にグラフを並べるだけでなく、重ね合わせたり、サイズを個別に調整したりといった、より複雑なグラフ描画が可能になります。

Chartオブジェクトとの違い

ChartChartContainerの関係性を理解することが、使いこなしの第一歩です。

  • Chartオブジェクト: グラフそのものです。棒グラフ(BarChart)、折れ線グラフ(LineChart)、円グラフ(PieChart)など、個々のグラフの種類とデータ、スタイルを定義します。
  • ChartContainerオブジェクト: Chartオブジェクトを格納する「額縁」や「キャンバス」のような存在です。どのグラフ(Chart)を、キャンバス上のどの位置に、どれくらいの大きさで描画するか、といったレイアウト情報を持ちます。

つまり、worksheet.add_chart()でシートに追加するのは、個々のChartオブジェクトではなく、レイアウト情報を持ったChartContainerオブジェクト(もしくはChartオブジェクト単体)ということになります。

なぜChartContainerが必要なのか?

worksheet.add_chart()でグラフを1つずつ追加していけば、複数配置できるのでは?」と思うかもしれません。もちろんそれも可能ですが、いくつかの課題があります。

例えば、ws.add_chart(chart1, "B2")ws.add_chart(chart2, "J2")のように配置した場合、以下の問題が発生しがちです。

  • 位置調整が煩雑: グラフのサイズやセルの幅が変わると、グラフ同士が重なってしまうことがあります。最適な配置場所(”B2″や”J2″)を手動で探すのは手間がかかります。
  • 管理が難しい: グラフが増えるほど、どのグラフがどのセルに対応しているのかをコード上で管理するのが大変になります。

ChartContainerは、これらの課題を解決します。複数のグラフを1つのまとまりとして扱い、そのまとまり全体をシートの特定範囲に配置します。コンテナ内部での各グラフの相対的な位置やサイズはLayoutオブジェクトで指定できるため、管理が非常に楽になり、レイアウト崩れも防ぎやすくなるのです。

ChartContainerの基本的な使い方(単一グラフの配置)

まずはChartContainerの最もシンプルな使い方として、1つのグラフを格納してシートに配置する手順を見ていきましょう。いきなり複数のグラフを扱う前に、この基本をマスターすることで、全体の流れがスムーズに理解できます。

Step 1: 準備(サンプルデータとExcelファイルの作成)

はじめに、openpyxlをインポートし、グラフの元となるデータを持つExcelファイルを作成します。ここでは、簡単な月別の売上データを例にします。

import openpyxl
from openpyxl.chart import BarChart, Reference, ChartContainer

# 新しいExcelワークブックを作成
wb = openpyxl.Workbook()
ws = wb.active
ws.title = "単一グラフのサンプル"

# グラフの元になるデータを書き込む
rows = [
    ["月", "売上"],
    ["1月", 400],
    ["2月", 350],
    ["3月", 500],
    ["4月", 450],
    ["5月", 600],
]

for row in rows:
    ws.append(row)

# この時点ではまだ保存しない

Step 2: Chartオブジェクトの作成

次に、書き込んだデータを使って棒グラフ(BarChart)を作成します。これはChartContainerを使わない場合と全く同じ手順です。

# 棒グラフオブジェクトを作成
chart1 = BarChart()
chart1.title = "月別売上"
chart1.x_axis.title = "月"
chart1.y_axis.title = "売上(万円)"

# グラフのデータ範囲を指定
# 2行目から6行目のB列(2列目)のデータを指定
data = Reference(ws, min_col=2, min_row=2, max_row=6)
# 2行目から6行目のA列(1列目)のカテゴリ(項目名)を指定
cats = Reference(ws, min_col=1, min_row=2, max_row=6)

# データをグラフに追加
chart1.add_data(data)
# カテゴリをグラフに追加
chart1.set_categories(cats)

Step 3: ChartContainerにグラフを追加し、シートに配置

ここからがChartContainerの出番です。作成したchart1オブジェクトをChartContainerに格納し、そのコンテナをシートに追加します。

単一のグラフを格納する場合、chartプロパティにChartオブジェクトを代入します。

# ChartContainerオブジェクトを作成
container = ChartContainer()

# 作成したグラフをコンテナに格納 (単一の場合は chart プロパティ)
container.chart = chart1

# シートのD2セルを左上としてコンテナ(と中のグラフ)を配置
ws.add_chart(container, "D2")

# 最後にExcelファイルを保存
wb.save("single_chart_with_container.xlsx")

これで、single_chart_with_container.xlsxというファイルが作成され、D2セルを起点として月別売上の棒グラフが配置されているはずです。 ここまでは単一のグラフなので、ChartContainerを使うメリットは感じにくいかもしれませんが、これが複数グラフを扱う際の基礎となります。

【実践】ChartContainerで複数のグラフを配置する方法

それでは、本題である複数のグラフを1つのコンテナにまとめて配置する方法を解説します。ここでは、先ほどの売上データを使って、「棒グラフ」と「折れ線グラフ」の2種類を左右に並べて表示する例を見ていきましょう。

Step 1: 複数のChartオブジェクトをそれぞれ作成する

まず、表示したいグラフの数だけChartオブジェクトを作成します。データソースは同じものを使い回します。

import openpyxl
from openpyxl.chart import BarChart, LineChart, Reference
from openpyxl.chart.layout import Layout, ManualLayout

# --- 準備(データ作成部分は先ほどと同じ) ---
wb = openpyxl.Workbook()
ws = wb.active
ws.title = "複数グラフのサンプル"
rows = [
    ["月", "売上", "目標"],
    ["1月", 400, 420],
    ["2月", 350, 380],
    ["3月", 500, 480],
    ["4月", 450, 460],
    ["5月", 600, 550],
]
for row in rows:
    ws.append(row)
# --- 準備ここまで ---

# --- グラフ1: 棒グラフの作成 ---
chart1 = BarChart()
chart1.title = "月別売上実績"
data1 = Reference(ws, min_col=2, min_row=2, max_row=6)
cats = Reference(ws, min_col=1, min_row=2, max_row=6)
chart1.add_data(data1)
chart1.set_categories(cats)
chart1.legend = None # 凡例は非表示に

# --- グラフ2: 折れ線グラフの作成 ---
chart2 = LineChart()
chart2.title = "月別売上目標"
data2 = Reference(ws, min_col=3, min_row=1, max_row=6) # ヘッダーを含めて範囲指定
chart2.add_data(data2, titles_from_data=True)
chart2.set_categories(cats)
chart2.legend = None # 凡例は非表示に

Step 2: ChartContainerに複数のグラフを格納する

複数のグラフを格納する場合、chartプロパティではなく、chartsプロパティ(複数形)を使います。ここに、作成したChartオブジェクトをリスト形式で渡します。

# ChartContainerオブジェクトを作成
container = ChartContainer()

# 作成した2つのグラフをリストにして格納 (複数の場合は charts プロパティ)
container.charts = [chart1, chart2]

Step 3: Layoutを使ってグラフの配置を調整する

ChartContainerの真価が発揮されるのが、このレイアウト調整機能です。openpyxl.chart.layoutモジュールにあるLayoutManualLayoutクラスを使います。

  • Layout: コンテナ内のグラフをどのように配置するかのルールを定義します。
  • ManualLayout: Layoutの一種で、各グラフの位置やサイズを細かく手動で設定できます。

各グラフの位置とサイズは、x, y, w (width), h (height) プロパティで指定します。これらの値は、コンテナ全体の幅と高さを1とした場合の相対的な割合(0から1の間の小数)で指定します。

  • x: コンテナの左端からの相対的な位置
  • y: コンテナの上端からの相対的な位置
  • w: コンテナの幅に対する相対的な幅
  • h: コンテナの高さに対する相対的な高さ

ここでは、コンテナを左右に2分割し、左側に棒グラフ、右側に折れ線グラフを配置してみましょう。

# レイアウトオブジェクトを作成
layout = Layout(
    manualLayout=ManualLayout(
        # 1つ目のグラフ(棒グラフ)のレイアウト
        # x=0, y=0 の位置から、幅50%, 高さ100%で配置
        l=ManualLayout(x=0, y=0, w=0.5, h=1), 
        # 2つ目のグラフ(折れ線グラフ)のレイアウト
        # x=0.5, y=0 の位置から、幅50%, 高さ100%で配置
        r=ManualLayout(x=0.5, y=0, w=0.5, h=1),
    )
)

# 作成したレイアウトをコンテナに適用
container.layout = layout

補足: ManualLayoutの引数名lrは、left, rightを意味し、レイアウトモード(layout.manualLayout.layoutTarget)と関連しますが、ここではグラフリストの順に対応するレイアウトとして機能します。

Step 4: ワークシートへの追加と保存

最後に、レイアウト設定済みのChartContainerをシートに追加し、Excelファイルを保存します。コンテナ全体のサイズは、add_chartで指定したセルの範囲によって決まります。ここでは”D2″から”M16″までの広い範囲を指定してみます。

# コンテナのサイズを調整
container.width = 30 # cm単位
container.height = 12 # cm単位

# シートのD2セルを左上としてコンテナを配置
ws.add_chart(container, "D2")

# Excelファイルを保存
wb.save("multiple_charts_with_container.xlsx")

このコードを実行すると、multiple_charts_with_container.xlsxが生成されます。ファイルを開くと、D2セルを起点とした大きな描画エリアの中に、左側に棒グラフ、右側に折れ線グラフが綺麗に並んで配置されていることが確認できるはずです。

まとめ

今回は、Pythonのopenpyxlライブラリを使って、複数のグラフを自在にレイアウトできるChartContainer機能について、基本的な使い方から実践的な配置方法までを解説しました。

最後に、この記事の重要なポイントを振り返りましょう。

  • **ChartContainerは複数のChartオブジェクトを格納する「入れ物」**であり、複雑なグラフ描画の管理を容易にします。
  • 単一のグラフは.chartプロパティ、複数のグラフは.chartsプロパティ(リスト形式)に格納します。
  • LayoutManualLayoutが、複数グラフのレイアウト調整の鍵です。コンテナ内での相対的な位置(x, y)とサイズ(w, h)を細かく指定できます。
  • ChartContainerを使いこなすことで、これまで手作業で行っていたグラフの配置調整を自動化でき、Excelレポート作成の効率が飛躍的に向上します。

openpyxlには、他にもたくさんの便利な機能があります。今回のChartContainerを足がかりに、ぜひあなたの業務自動化に役立ててみてください。

コメント

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