HOWTO · Matplotlib

Matplotlib のサブプロットにタイトルを追加する方法

Axes.set_title()、Axes.title.set_text()、または pyplot の現在の Axes(plt.gca())を使用して、Matplotlib のサブプロットにタイトルを追加できます。

このページの内容

各サブプロットに個別のタイトルを付けるには、対応する Axes に対して Axes.set_title() を呼び出します。複数のプロットをまとめて作成する場合、各タイトルが説明対象の Axes に結び付くため、最も分かりやすい方法です。サブプロットのタイトルは個々の Axes に付けます。図全体を表す見出しを付ける場合は、fig.suptitle() のような図レベルのタイトルを使います。

Axes.set_title() でサブプロットにタイトルを付ける

squeeze=False を指定して plt.subplots() を呼び出すと、Figure と Axes の配列が返されます。次の例では、4つの系列をプロットし、各 Axes に説明的なタイトルを割り当ててから、図を表示する前にレイアウトを整えます。この指定により、2×2 のグリッド、1行(1×N)、1列(N×1)、単一のサブプロット(1×1)のいずれでも、axes は2次元配列になります。グリッドのサイズを変える場合は、plt.subplots() の引数を調整し、すべての Axes にタイトルを1つずつ用意してください。

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, 2 * np.pi, 100)
series = [np.sin(x), np.cos(x), np.sin(2 * x), np.cos(2 * x)]
titles = ["Sine", "Cosine", "Sine, double frequency", "Cosine, double frequency"]

fig, axes = plt.subplots(2, 2, figsize=(8, 5), squeeze=False)
for ax, y, title in zip(axes.flat, series, titles):
    ax.plot(x, y)
    ax.set_title(title)

fig.tight_layout()
plt.show()

squeeze=False を指定すると、1×1 のグリッドでも Axes が2次元配列に保たれるため、axes.flat を使えば2×2、1×N、N×1、1×1の4種類の形状を同じ方法で反復処理できます。zip() は各 Axes とデータ系列をタイトルと順番に対応付けます。すべての Axes にタイトルを付けるには、これらのコレクションの順序と長さをそろえてください。

label 引数には、Axes の上に表示する文字列を指定します。fontsize や loc などのオプションを渡して、タイトルの見た目や位置を調整することもできます。長いタイトルは簡潔にし、隣り合うタイトルやラベルの間隔が狭い場合は、表示前に Figure のサイズを大きくするか、間隔を調整してください。tight_layout() は調整の出発点として便利ですが、装飾が多いレイアウトでは、さらに間隔の調整が必要になることがあります。コード例内のタイトル文字列は英語のままです。

Axes.title.set_text() でサブプロットのタイトルを設定する

Axes からは、タイトルをテキストオブジェクトとして取得することもできます。Axes の作成後にそのテキストを設定または更新するには、Axes.title.set_text() を使います。プログラムがすでにタイトルオブジェクトへの参照を保持している場合や、後から文言を変更する場合に便利です。プロットを最初に設定するときは、一般に Axes.set_title() のほうが直接的で、Axes の呼び出し箇所から処理内容が分かりやすくなります。

たとえば、ax という名前の Axes を作成した後、ax.title.set_text("Updated title") を呼び出します。これにより、その Axes のタイトルが更新されます。Figure 内のすべてのサブプロットにタイトルが設定されるわけではありません。複数の Axes がある場合は、更新する対象を明示的に選ぶか、最初の例のように Axes と対応する文字列をループで処理します。どちらの API も Axes のタイトルを扱うため、同じタイトルを二重に設定せず、1つの操作にはどちらか一方を使ってください。

pyplot の現在の Axes を使ってサブプロットにタイトルを付ける

状態ベースの pyplot インターフェースでは、plt.gca() が現在の Axes を返します。plt.gca().set_title("Title") でそのタイトルを設定できます。同等のテキストオブジェクト形式は plt.gca().title.set_text("Title") です。括弧が重要です。gca() は現在の Axes を取得する関数呼び出しです。これらの形式が作用するのは、その時点で現在になっている Axes だけなので、1つずつ Axes を描画する場合に便利です。

グリッドの場合は、タイトルを設定する前に各サブプロットを選択します。たとえば plt.subplot(2, 2, position) は1から4までの位置を選択し、その後 plt.gca().set_title(title) で選択した Axes にタイトルを設定します。fig, axes = plt.subplots(...) でグリッドを作成する場合は、返された Axes の参照を使うほうが通常は分かりやすく、pyplot の現在の状態にも左右されにくくなります。

plt.show() を呼び出す前に、Figure の設定を済ませてください。特に、サブプロットのタイトルをレイアウトに反映できるよう、表示前に plt.tight_layout() を呼び出します。ここに示すのはコード例のみで、実行結果は含まれていません。