matplotlibでは、グラフに凡例(legend)を追加することができますが、デフォルトの枠のデザインでは味気ないと感じることがあるかもしれません。本記事では、凡例の枠のスタイルをカスタマイズする方法を詳しく解説します。
基本的な凡例の表示
まずは、matplotlibで凡例を表示する基本的なコードを見てみましょう。
import matplotlib.pyplot as plt
import numpy as np
# データの準備
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)
# グラフの作成
plt.plot(x, y1, label="sin(x)")
plt.plot(x, y2, label="cos(x)")
# 凡例の表示
plt.legend()
# グラフの表示
plt.show()

このコードを実行すると、凡例がデフォルトの枠付きで表示されます。次に、この枠のスタイルを変更する方法を見ていきましょう。
凡例の枠を非表示にする
枠を削除したい場合は、frameon=False
を指定します。
plt.legend(frameon=False)
このオプションを追加すると、凡例の枠がなくなり、テキストと凡例のマーカーだけが表示されます。

凡例の枠の透明度を調整する
枠の透明度を変更するには、framealpha
を指定します。
plt.legend(frameon=True, framealpha=0.5)
この設定では、枠の透明度が50%(0.5)になり、背景が少し透けて見えます。完全に不透明にする場合は 1.0
、完全に透明にする場合は 0.0
を指定します。

凡例の枠の角を丸くする
枠の角を丸くするには、fancybox=True
を指定します。
plt.legend(frameon=True, fancybox=True)
このオプションを有効にすると、凡例の枠が角丸のデザインになります。デフォルト値はrcParams に従いますが、True となっています。
Falseを指定すると角丸にしません。
plt.legend(frameon=True, fancybox=False)

凡例の枠の影をつける
凡例の枠に影をつけるには、shadow=True
を指定します。
plt.legend(frameon=True, shadow=True)
これを追加すると、凡例の枠に影がつき、少し立体的な見た目になります。

凡例の枠の線種を変更する
枠の線種を変更するには、edgecolor
(枠線の色)と linestyle
(線のスタイル)を指定します。線種(linestyle)の変更は、凡例オブジェクトから枠(frame)を取得し、そのプロパティを変更する方法で行います。
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)
plt.plot(x, y1, label="sin(x)")
plt.plot(x, y2, label="cos(x)")
# 凡例を作成(edgecolorを指定)
legend = plt.legend(frameon=True, edgecolor="red")
# 凡例の枠に対して線種を変更
frame = legend.get_frame()
frame.set_linestyle("dashed") # または '--' でも可
plt.show()
この例では、枠の色を赤 (red
) にし、破線 (dashed
) に設定しています。

Linestyle(線のスタイル)オプション一覧
オプション | 同義語 | 説明 |
---|---|---|
'-' | 'solid' | 実線(デフォルト) |
'--' | 'dashed' | 破線 |
'-.' | 'dashdot' | 点線と破線の組み合わせ |
':' | 'dotted' | 点線 |
(タプル) | - | カスタムダッシュパターン(例: (0, (3, 5, 1, 5)) ) |
※ set_linestyle()
メソッドにこれらの値を渡して使用します。
Edgecolor(枠線の色)オプション一覧
Matplotlibでは、edgecolor
に対しては標準のカラー指定方法がすべて利用可能です。主な指定方法は以下の通りです。
オプション | 説明 |
---|---|
'b' | 青(blue) |
'g' | 緑(green) |
'r' | 赤(red) |
'c' | シアン(cyan) |
'm' | マゼンタ(magenta) |
'y' | 黄(yellow) |
'k' | 黒(black) |
'w' | 白(white) |
カラー名文字列 | CSS4で定義される任意のカラー名(例: 'orange' 、'purple' など) |
HEXカラーコード | 例: '#FF5733' 、'#00FF00' |
RGBタプル | 例: (1.0, 0.0, 0.0) (赤) |
凡例の枠の詳細なカスタマイズ
凡例オブジェクトから枠のプロパティを直接変更する
plt.legend()
の戻り値である凡例オブジェクトを利用すると、枠(FancyBboxPatch
オブジェクト)の細かいプロパティを直接変更することができます。以下のコード例では、枠線の太さ、枠線の色、背景色を変更しています。
import matplotlib.pyplot as plt
import numpy as np
# データの準備
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)
# グラフの作成
plt.plot(x, y1, label="sin(x)")
plt.plot(x, y2, label="cos(x)")
# 凡例の生成(fancyboxで角丸にする)
legend = plt.legend(frameon=True, fancybox=True)
# 凡例の枠にアクセスし、プロパティを変更
frame = legend.get_frame()
frame.set_linewidth(2) # 枠線の幅を2に設定
frame.set_edgecolor("green") # 枠線の色を緑に設定
frame.set_facecolor("lightgray") # 枠の背景色をライトグレーに設定
plt.show()

枠のボックススタイルの変更
matplotlibのFancyBboxPatch
は、枠のボックススタイルを変更する機能も持っています。set_boxstyle()
メソッドを用いると、角の丸みやパディングを細かく調整できます。例えば、以下のコードでは、角を丸くし、パディングを0.5に設定しています。
legend = plt.legend(frameon=True, fancybox=True)
frame = legend.get_frame()
frame.set_boxstyle("round,pad=0.5")

この設定により、見た目に柔らかさが加わり、グラフ全体の印象を向上させることができます。
複数のオプションを組み合わせる際の注意点
- fancyboxとset_boxstyleの併用
fancybox=True
は角丸のスタイルを適用するための簡便な方法ですが、set_boxstyle()
でカスタムボックススタイルを設定した場合、後者が優先されます。用途に応じて使い分けるとよいでしょう。 - 変更の反映
インタラクティブモードがオフの場合、または既存の図に対して変更を加える場合は、plt.draw()
を呼び出すことで変更を即時反映させることができます。
その他の凡例カスタマイズのヒント
凡例の枠以外にも、以下のような設定項目を組み合わせることで、より見やすいグラフを作成できます。
- 凡例の位置調整
loc
オプションで凡例の位置を指定することができます。例:plt.legend(loc="upper right")
- 凡例内の間隔調整
borderpad
、labelspacing
、handlelength
などのパラメータを用いることで、凡例内のテキストとマーカー間のスペースや、枠と内容の間隔を調整できます。
これらのオプションは、グラフの見やすさを向上させるために有用です。
まとめ
Matplotlibでは、凡例の枠を細かくカスタマイズできます。以下に今回紹介した設定をまとめます。
設定 | オプション | 例 |
---|---|---|
枠を非表示にする | frameon=False | plt.legend(frameon=False) |
枠の色を変更する | edgecolor="色" | plt.legend(edgecolor="red") |
枠の線種を変更する | linestyle="スタイル" | plt.legend(linestyle="dashed") |
枠の透明度を変更する | framealpha=値 | plt.legend(framealpha=0.5) |
角丸にする | fancybox=True | plt.legend(fancybox=True) |
影をつける | shadow=True | plt.legend(shadow=True) |
これらを組み合わせることで、より見やすいグラフを作成できます。
ぜひ、自分の用途に合ったデザインを試してみてください!