PythonでExcelグラフの第2軸(系列軸)を追加・削除・設定するならopenpyxl SeriesAxisが鍵!

openpyxl

はじめに:openpyxlのグラフ作成でこんな悩みありませんか?

この記事では、Pythonのopenpyxlライブラリを使ってExcelの複合グラフを作成する際に、多くの人がつまずきがちな「第2軸(系列軸)」の扱い方について徹底的に解説します。

  • 「棒グラフと折れ線グラフを組み合わせたいけど、軸のスケールが違いすぎる…」
  • 「特定のデータ系列だけを右側の軸に表示させたい」
  • SeriesAxisというクラスがあるのは知っているけど、具体的な使い方がわからない」

openpyxlは非常に高機能ですが、特にグラフの細かいカスタマイズに関しては、公式ドキュメントだけでは理解が難しい部分もあります。しかし、ご安心ください。

この記事を最後まで読めば、SeriesAxisを使いこなし、見た目も分かりやすい複合グラフを自在に作成できるようになります。


そもそもopenpyxlにおけるSeriesAxisとは?

結論から言うと、SeriesAxisはグラフの「系列」をベースにした軸、すなわち第2軸(多くは右側の縦軸)を作成・操作するために使う専用のクラスです。

openpyxlでグラフの軸を扱うクラスにはいくつか種類があり、それぞれの役割を理解することが、グラフ作成をマスターする第一歩です。

ValueAxisやCategoryAxisとの明確な違い

openpyxlの主要な軸クラスとの違いを整理してみましょう。

  • ValueAxis(数値軸)
    • 役割:グラフの数値を表す主軸です。通常はグラフの左側にある縦軸(Y軸)を指します。
    • 例:売上金額、販売数量など。
  • CategoryAxis(項目軸)
    • 役割:グラフの項目を表す軸です。通常はグラフの下側にある横軸(X軸)を指します。
    • 例:月、商品名、支店名など。
  • SeriesAxis(系列軸)
    • 役割:特定のデータ系列のための追加の数値軸です。これが第2軸の正体です。
    • 用途:売上(単位:万円)と利益率(単位:%)のように、スケール(単位や範囲)が大きく異なるデータを1つのグラフ上に共存させるために使用します。

ValueAxisが主役の数値軸なら、SeriesAxisは「もう一つの主役」を立てるための特別な軸、とイメージすると分かりやすいでしょう。


実践①:SeriesAxisを使って第2軸を追加・設定する

ここからは、具体的なコードを見ながら第2軸の追加と設定方法を学びます。今回は、**月ごとの売上(棒グラフ)達成率(折れ線グラフ)**を組み合わせた複合グラフを例に進めます。

Step 1: 準備(ライブラリのインポートとサンプルデータ作成)

まずはopenpyxlとグラフ作成に必要なクラスをインポートし、グラフの元となる簡単なサンプルデータをワークシートに書き込みます。

import openpyxl
from openpyxl.chart import BarChart, LineChart, Reference
from openpyxl.chart.axis import SeriesAxis

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

# サンプルデータを書き込み
rows = [
    ["月", "売上(万円)", "達成率(%)"],
    ["1月", 120, 85],
    ["2月", 150, 95],
    ["3月", 180, 110],
    ["4月", 160, 105],
    ["5月", 200, 120],
    ["6月", 210, 115],
]

for row in rows:
    ws.append(row)

Step 2: ベースとなるグラフ(棒グラフ)を作成する

次に、主軸(左側)に表示する「売上」の棒グラフを作成します。これはopenpyxlの基本的なグラフ作成手順です。

# 棒グラフオブジェクトを作成
bar_chart = BarChart()
bar_chart.title = "月次売上と達成率"
bar_chart.style = 10

# データを設定 (B1:B7の範囲)
data = Reference(ws, min_col=2, min_row=1, max_row=7)
# 項目軸ラベルを設定 (A2:A7の範囲)
cats = Reference(ws, min_col=1, min_row=2, max_row=7)

bar_chart.add_data(data, titles_from_data=True)
bar_chart.set_categories(cats)

# Y軸(主軸)のタイトルを設定
bar_chart.y_axis.title = "売上 (万円)"

Step 3: 第2軸に表示するグラフ(折れ線グラフ)を追加する

続いて、第2軸(右側)に表示したい「達成率」の折れ線グラフを作成します。

ポイントは、この時点ではまだ第2軸に割り当てず、単純にグラフオブジェクトを作成し、データを設定するだけという点です。

# 折れ線グラフオブジェクトを作成
line_chart = LineChart()

# データを設定 (C1:C7の範囲)
data = Reference(ws, min_col=3, min_row=1, max_row=7)
line_chart.add_data(data, titles_from_data=True)

# 折れ線グラフのマーカーを円にする
line_chart.series[0].marker.symbol = "circle"
line_chart.series[0].marker.size = 8

Step 4: SeriesAxisをインスタンス化し、折れ線グラフを第2軸に割り当てる

ここがこの記事の最重要ポイントです。SeriesAxisを使って、先ほど作成した折れ線グラフを第2軸に関連付けます。

# --- 第2軸(SeriesAxis)の作成 ---
# 1. SeriesAxisをインスタンス化
line_chart.y_axis = SeriesAxis()

# 2. 棒グラフと折れ線グラフを組み合わせる
bar_chart += line_chart

openpyxl 3.0以降では、グラフを第2軸に割り当てる処理が簡素化されています。作成したLineChartオブジェクトのy_axisプロパティにSeriesAxisのインスタンスを代入するだけで、そのグラフが第2軸を使用することを指定できます。

最後に、+=演算子を使って棒グラフと折れ線グラフを組み合わせれば、自動的にSeriesAxisが第2軸として認識されます。

Step 5: 第2軸の見た目をカスタマイズする

第2軸を追加しただけでは、タイトルも目盛りも自動設定のままです。SeriesAxisオブジェクトのプロパティを操作して、見やすいようにカスタマイズしましょう。

# 第2軸のタイトルを設定
bar_chart.y_axis.title = "売上 (万円)"
bar_chart.right.title = "達成率 (%)" # 第2軸は .right でアクセス可能

# 第2軸の目盛りの最大値・最小値を設定
bar_chart.right.scaling.max = 150
bar_chart.right.scaling.min = 50

# 第2軸の表示形式をパーセンテージに設定
bar_chart.right.number_format = '0"%"'

# 凡例の位置を調整
bar_chart.legend.position = 'b' # b: bottom(下)

# グラフをシートに追加
ws.add_chart(bar_chart, "E2")

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

bar_chart.right というプロパティを通じて、追加した第2軸にアクセスできるのが便利です。これで、スケールの異なる2つのデータを1つのグラフに分かりやすく表示できました。


実践②:不要になった第2軸(SeriesAxis)を削除する

追加した第2軸が不要になった場合に、グラフから削除する方法も見ていきましょう。最も簡単で推奨されるのは、軸を「非表示」にする方法です。

軸を非表示にする方法 (.delete = True)

結論として、軸のdeleteプロパティをTrueに設定するのが最も手軽です。これにより、軸のオブジェクト自体はメモリ上に残りますが、Excelファイル上では表示されなくなります。

# 第2軸を非表示にする
if bar_chart.right: # 第2軸が存在するか確認
    bar_chart.right.delete = True

この方法は、後から再び表示させたくなった場合にも bar_chart.right.delete = False と戻すだけで済むため、非常に柔軟です。

グラフオブジェクトから完全に削除する方法

openpyxlの内部構造では、グラフは複数の軸オブジェクト(chart.axリスト)を保持しています。ここから直接SeriesAxisを削除することも可能ですが、関連する系列の設定も変更する必要があり、処理が複雑になりがちです。

特別な理由がない限りは、前述の.delete = Trueを使う方法を推奨します。


SeriesAxisを使う上での注意点とTips

最後に、SeriesAxisを扱う上で知っておくと便利な知識や、つまずきやすいポイントを解説します。

軸のID(axId)は適切に管理しよう

openpyxlの内部では、主軸と第2軸はそれぞれユニークなID(axId)で管理されています。通常、openpyxlが自動でIDを割り振ってくれるため意識する必要はあまりありません。しかし、より複雑なグラフ(例:第3軸、第4軸を持つグラフ)を作成する場合は、このaxIdを手動で設定し、各データ系列がどの軸に属するのかを明示的に指定する必要があります。

第2軸に複数のデータ系列を割り当てるには?

1つの第2軸に、複数の折れ線グラフなどを割り当てたいケースもあるでしょう。その場合も手順は同じです。

  1. 追加したいグラフオブジェクトをそれぞれ作成する。
  2. 各グラフオブジェクトの.y_axisプロパティに、同じSeriesAxisインスタンスを代入する。
  3. ベースのグラフに、作成したグラフを+=で順番に足していく。

これにより、複数のデータ系列が同じ第2軸を共有するグラフを作成できます。


まとめ

今回は、openpyxlで複合グラフを作成する際の鍵となるSeriesAxisについて、その基本から実践的な使い方までを解説しました。

  • SeriesAxisは、openpyxlで**第2軸(系列軸)**を扱うための専用クラスです。
  • スケールの異なるデータを一つのグラフにまとめる際に必須となります。
  • グラフオブジェクトの.y_axis = SeriesAxis()と設定し、ベースのグラフと+=で結合することで簡単に追加できます。
  • 追加した第2軸は.rightプロパティでアクセスでき、タイトルや目盛り、表示形式も自由にカスタマイズ可能です。

SeriesAxisをマスターすれば、PythonでのExcel帳票作成やデータ可視化の幅が大きく広がります。単なるデータの羅列ではなく、「伝わる」資料を自動生成する強力な武器になります。

ぜひ、今回のコードをベースに、あなたの業務や研究で色々なグラフ作成に挑戦してみてください。

コメント

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