Data Visualization

全てのサブプロットに対応する統一凡例の作成:Matplotlib凡例マスター

Spread the love

Matplotlibは、視覚化を作成するための強力なPythonライブラリです。しかし、複数のサブプロットを扱う場合、凡例を管理することが複雑になることがあります。この記事では、すべてのサブプロットにわたって単一の統合された凡例を作成するための効率的な方法を紹介します。

目次

Matplotlibにおけるサブプロットの理解

サブプロットは、単一の図の中に複数のプロットを配置します。Matplotlibでは、matplotlib.pyplot.subplots()を使って作成します。これは、figureオブジェクトとaxesオブジェクトの配列(サブプロットごとに1つ)を返します。

import matplotlib.pyplot as plt

fig, axes = plt.subplots(2, 2)  # 2x2グリッドのサブプロット

# 各サブプロットにデータをプロット
axes[0, 0].plot([1, 2, 3], [4, 5, 6], label='Line 1')
axes[0, 1].plot([1, 2, 3], [7, 8, 9], label='Line 2')
axes[1, 0].plot([1, 2, 3], [10, 11, 12], label='Line 1')
axes[1, 1].plot([1, 2, 3], [13, 14, 15], label='Line 2')

plt.show()

これにより、それぞれ独自の凡例を持つ2×2グリッドが作成されます。これらを単一の凡例に統合します。

方法1: fig.legend()を使う

最も簡単な方法は、figureオブジェクトのlegend()メソッドを使用することです。これには、すべての凡例ハンドルとラベルを収集する必要があります。

import matplotlib.pyplot as plt

fig, axes = plt.subplots(2, 2)

lines1, = axes[0, 0].plot([1, 2, 3], [4, 5, 6], label='Line 1')
lines2, = axes[0, 1].plot([1, 2, 3], [7, 8, 9], label='Line 2')
lines3, = axes[1, 0].plot([1, 2, 3], [10, 11, 12], label='Line 1')
lines4, = axes[1, 1].plot([1, 2, 3], [13, 14, 15], label='Line 2')

# 一意のハンドルとラベルを収集
handles = [lines1, lines2] 
labels = [h.get_label() for h in handles]

fig.legend(handles, labels, loc='upper right')

plt.show()

注: 凡例に重複がないように、一意のハンドルのみを使用しています。locは凡例の位置を指定します。

方法2: 凡例の位置と外観のカスタマイズ

凡例の位置、枠線、フォントサイズなどをカスタマイズできます。

import matplotlib.pyplot as plt

# ... (方法1からのプロットコード) ...

fig.legend(handles, labels, loc='lower center', bbox_to_anchor=(0.5, -0.1), ncol=2, frameon=True, fontsize=12)

plt.show()

ここでは、凡例を下中央に配置し、bbox_to_anchorで垂直方向の位置を調整し、2列(ncol=2)を使用し、枠線を追加(frameon=True)し、フォントサイズを大きくしました。

方法3: サブプロットごとの複数の線に対応する

サブプロット内に複数の線がある場合、関連するすべてのハンドルとラベルを収集します。

import matplotlib.pyplot as plt

fig, ax = plt.subplots()

line1, = ax.plot([1, 2, 3], [4, 5, 6], label='Line 1')
line2, = ax.plot([1, 2, 3], [7, 8, 9], label='Line 2')
line3, = ax.plot([1, 2, 3], [10, 11, 12], label='Line 3')

fig.legend([line1, line2, line3], [line1.get_label(), line2.get_label(), line3.get_label()], loc='best')
plt.show()

結論

すべてのサブプロットに単一の凡例を作成することで、Matplotlibの視覚化の明瞭さと可読性が向上します。上記の方法では、fig.legend()と適切なハンドル/ラベルの管理を使用して、凡例の位置と外観を制御できます。

FAQ

  • Q: 線の種類が異なる場合はどうなりますか? A: 凡例にはこれらの違いが自動的に反映されます。
  • Q: 同じラベルに異なる色を使用できますか? A: はい、できますが、凡例にはラベルごとに1色しか表示されません。区別するために異なるラベルを使用してください。
  • Q: 凡例がプロットと重なっています。 A: bbox_to_anchorloc、フォントサイズ、または図のサイズを調整してください。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です