openpyxlでExcelグラフの凡例を編集!位置調整から非表示まで徹底解説

openpyxl

Pythonのopenpyxlは、Excelファイルの読み書きや操作を自動化するための強力なライブラリです。特に、レポート作成などでグラフを自動生成する機能は非常に便利です。しかし、デフォルトで作成されるグラフの「凡例(Legend)」が、思った通りの位置になかったり、不要なのに表示されてしまったりと、細かな調整に困った経験はないでしょうか?

この記事では、openpyxlを使ってExcelグラフの凡例(Legend)を自由自在にカスタマイズする方法を、初心者の方にも分かりやすく徹底解説します。

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

  • 凡例の表示・非表示を自由に切り替える
  • 凡例をグラフの上下左右、好きな位置に調整する
  • 特定のデータ系列だけを凡例から隠す
  • 凡例をグラフに重ねて表示する応用テクニック

具体的なコード例を豊富に交えながら解説しますので、ぜひ最後までご覧ください。

はじめに:凡例操作の前提となるグラフの準備

まずは、これから凡例を操作していく対象となる、基本的なExcelグラフをopenpyxlで作成する方法を確認しておきましょう。すでにグラフ作成に慣れている方は、このセクションを読み飛ばしていただいても構いません。

以降の解説は、ここで作成する「月別の売上と予測」を示す棒グラフをベースに進めていきます。

サンプルデータとグラフの作成コード

以下のコードは、サンプルデータを作成し、それに基づいた棒グラフを含むExcelファイル sample_chart.xlsx を生成します。openpyxlが未インストールの方は、ターミナルやコマンドプロンプトでpip install openpyxlを実行してください。

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

# 1. 新しいワークブックを作成
wb = openpyxl.Workbook()
ws = wb.active
ws.title = "MonthlySales"

# 2. サンプルデータをシートに追加
rows = [
    ["月", "実績", "予測"],
    ["1月", 400, 420],
    ["2月", 450, 460],
    ["3月", 500, 510],
    ["4月", 580, 550],
    ["5月", 620, 600],
    ["6月", 680, 650],
]

for row in rows:
    ws.append(row)

# 3. グラフオブジェクトを作成 (棒グラフ)
chart = BarChart()
chart.type = "col"
chart.style = 10
chart.title = "月別売上実績と予測"
chart.y_axis.title = "売上(万円)"
chart.x_axis.title = "月"

# 4. グラフのデータ範囲と系列を設定
data = Reference(ws, min_col=2, min_row=1, max_row=7, max_col=3)
cats = Reference(ws, min_col=1, min_row=2, max_row=7)

# データソースをグラフに追加
chart.add_data(data, titles_from_data=True)
# X軸のラベルを設定
chart.set_categories(cats)

# 凡例を初期状態(右側)で表示
chart.legend.position = 'r' 

# 5. ワークシートにグラフを追加
ws.add_chart(chart, "E2")

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

print("グラフ付きのExcelファイル 'sample_chart.xlsx' を作成しました。")

このコードを実行すると、カレントディレクトリにsample_chart.xlsxというファイルが作成され、中には綺麗な棒グラフが描かれているはずです。このグラフの凡例を、これから様々な方法で編集していきます。

openpyxlにおける凡例(Legend)オブジェクトの基本

openpyxlで凡例を操作する上で最も重要なことは、Chartオブジェクトがlegendという属性を持っていることを理解することです。

凡例に関するすべての操作は、このchart.legendを通じて行います。

# chartオブジェクトからlegendオブジェクトを取得
legend = chart.legend

このlegendオブジェクトは、openpyxl.chart.legend.Legendクラスのインスタンスです。このオブジェクトが持つプロパティ(positionなど)を変更することで、凡例の見た目をカスタマイズしていく、という流れになります。非常にシンプルですね。

【基本操作】凡例の表示・非表示を切り替える

まずは最も基本的な操作として、凡例を表示させたり、逆に非表示にしたりする方法を見ていきましょう。グラフによっては凡例が不要なケースも多々あります。

グラフから凡例を完全に削除(非表示に)する方法

結論から言うと、凡例を非表示にするのは非常に簡単で、chart.legend属性にNoneを代入するだけです。

先ほど作成したsample_chart.xlsxを読み込み、凡例を削除して別名で保存するコードは以下のようになります。

from openpyxl import load_workbook

# Excelファイルを読み込む
wb = load_workbook("sample_chart.xlsx")
ws = wb["MonthlySales"]

# シート内の最初のグラフオブジェクトを取得
chart = ws._charts[0]

# 凡例を非表示にする
chart.legend = None

# 変更を保存
wb.save("chart_no_legend.xlsx")

print("凡例を削除したファイル 'chart_no_legend.xlsx' を作成しました。")

このコードを実行してchart_no_legend.xlsxを開くと、グラフの右側にあった「実績」と「予測」の凡例が綺麗に消えていることが確認できます。

特定の系列だけ凡例から非表示にする

全体を消すのではなく、「実績」だけ表示して「予測」は凡例から隠したい、といったケースもあるでしょう。

この場合、LegendEntryオブジェクトを使い、表示したい凡例のインデックスを指定します。 データ系列は0から始まるインデックスを持っており、「実績」が0、「予測」が1となります。

例えば、「実績」(インデックス0)だけを凡例に表示するには、以下のように記述します。

from openpyxl import load_workbook
from openpyxl.chart.legend import LegendEntry

# Excelファイルを読み込む
wb = load_workbook("sample_chart.xlsx")
ws = wb["MonthlySales"]

# シート内の最初のグラフオブジェクトを取得
chart = ws._charts[0]

# 表示したい凡例のインデックスのみを指定する
# 今回はインデックス0の「実績」のみ表示
chart.legend.legendEntry = [
    LegendEntry(idx=0) 
]

# 変更を保存
wb.save("chart_partial_legend.xlsx")

print("凡例を一部非表示にしたファイル 'chart_partial_legend.xlsx' を作成しました。")

legendEntryプロパティに、表示したい系列のインデックスを持つLegendEntryオブジェクトのリストを渡すのがポイントです。

【最重要】凡例(Legend)の位置を自由に調整する

ここが本記事のメインテーマです。凡例の表示位置を調整する方法をマスターしましょう。レポートのレイアウトに合わせて凡例を動かせると、グラフの見た目が格段に向上します。

legend.position プロパティの使い方

凡例の位置調整は、chart.legend.positionプロパティに位置を示す文字列を設定するだけで完了します。

設定できる主な値は以下の通りです。

  • 'r' : 右 (Right) – デフォルト
  • 'l' : 左 (Left)
  • 't' : 上 (Top)
  • 'b' : 下 (Bottom)
  • 'tr' : 右上 (Top-Right)

他にも'tl'(左上)などもありますが、まずは上記の5つを覚えておけば十分でしょう。

コードで実践!凡例の上下左右への配置例

それでは、実際に凡例の位置を「下」に変更してみましょう。コードは非常に直感的です。

from openpyxl import load_workbook

# Excelファイルを読み込む
wb = load_workbook("sample_chart.xlsx")
ws = wb["MonthlySales"]

# シート内の最初のグラフオブジェクトを取得
chart = ws._charts[0]

# 凡例の位置を '下 (bottom)' に設定
chart.legend.position = 'b'

# 変更を保存
wb.save("chart_legend_bottom.xlsx")

print("凡例を下に配置したファイル 'chart_legend_bottom.xlsx' を作成しました。")

chart.legend.position = 'b' の一行を追加しただけです。生成されたファイルを開くと、凡例がグラフの下側に移動しているのがわかります。同様に、't'を指定すれば上部に、'l'を指定すれば左側に配置できます。簡単ですね!

【応用編】一歩進んだ凡例のカスタマイズ

基本的な操作をマスターしたら、もう少し応用的なカスタマイズにも挑戦してみましょう。

凡例をグラフエリアに重ねて表示する(オーバーレイ)

デフォルトでは、凡例はグラフの描画エリア(プロットエリア)の外側に配置されます。これにより、凡例を表示するとグラフ本体の表示領域が少し狭くなります。

グラフの表示領域を最大限に使いつつ凡例を表示したい場合は、凡例をオーバーレイ表示させるのが有効です。 これにはoverlayプロパティを使用します。

from openpyxl import load_workbook

# Excelファイルを読み込む
wb = load_workbook("sample_chart.xlsx")
ws = wb["MonthlySales"]

# シート内の最初のグラフオブジェクトを取得
chart = ws._charts[0]

# 凡例の位置を '右上' に設定
chart.legend.position = 'tr'
# 凡例のオーバーレイを有効にする
chart.legend.overlay = True

# 変更を保存
wb.save("chart_legend_overlay.xlsx")

print("凡例をオーバーレイ表示したファイル 'chart_legend_overlay.xlsx' を作成しました。")

このコードでは、凡例を右上(tr)に配置し、さらにoverlay = Trueと設定しました。生成されたファイルを見ると、グラフの描画エリアを狭めることなく、その右上に凡例が重ねて表示されているのが確認できます。

(参考)凡例の書式設定(フォントや枠線)について

「凡例の文字サイズを変えたい」「凡例を枠線で囲みたい」といった、より細かい書式設定をしたい場合もあるかもしれません。

残念ながら、2025年現在のopenpyxlでは、chart.legend.fontのような簡単なプロパティで凡例のフォントや枠線を直接、詳細に設定する機能は提供されていません。これらの設定はExcelファイルの複雑なXML構造に依存しているため、ライブラリからの直接操作が難しくなっています。

もしどうしても変更が必要な場合は、一度openpyxlでグラフを作成したのち、Excelのテンプレート機能を使うか、手動でスタイルを調整するといったアプローチが現実的です。

まとめ

今回は、Pythonのopenpyxlライブラリを使って、Excelグラフの凡例(Legend)を自在に操る方法について解説しました。最後に、重要なポイントを振り返りましょう。

  • 凡例の操作は、すべて**chart.legend**オブジェクトを通じて行います。
  • 凡例を非表示にするには**chart.legend = None**と設定します。
  • 凡例の位置は**chart.legend.position**プロパティに'r', 'b', 't'などの文字列を設定して調整します。
  • 特定の凡例だけを非表示にするには、LegendEntry(idx=...)を使います。
  • グラフ描画領域を広く使いたい場合は、**chart.legend.overlay = True**でオーバーレイ表示が利用できます。

これらのテクニックを使えば、openpyxlで自動生成するグラフの見た目を大きく改善し、よりプロフェッショナルなレポートを作成できます。ぜひ、ご自身のプロジェクトで活用してみてください。

コメント

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