Matplotlibのグラフの構成要素

Matplotlibを使うときに真っ先に疑問符がつくのが、figureとaxesって何? ということかなと思います。この辺り、理解が曖昧でしたので整理してみました。

Matplotlibで作成されるグラフは大きくFigureとAxesの2つから構成されていて、役割としては以下です。

  • Figure:描画する画像全体(画像キャンバス)
  • Axes (Ax):個々のグラフ。Axはそれぞれ要素Axisを持ち、軸の情報を定義する

また、Figureの描画設定(視覚的な要素)は全て、Artistとして定義され、画像出力するときに読み込まれます。
下の図はざっくりとした構成イメージです。

FigureとAxesの作成

グラフを描画するには、(1)画像キャンバスFigureを作成、(2) 描画領域Axesを作成の手順を踏むことになります。やり方としては大きく2つです。

  1. plt.figure()によるFigureの作成
  2. plt.subplots()によるFigureとAxesの作成
fig = plt.figure() # 1. figureのみ作成

fig, ax = plt.subplots() # 2. figure+1つのaxを作成
fig, axs = plt.subplots(2, 2) # 2. figure+2x2のaxを作成

このとき、plt.figure()で作成されたFigureはAxesを持たない白紙のキャンバスで、随時、add_subplots()でAxesを追加してグラフを描画していくことになります。
一方、plt.subplots()ではAxesが作成されますので、描画したいAxesをすることでグラフの描画を行うことができます。

具体的な動作の違いについて次に確認します。

plt.figure()とplt.subplots()の挙動の違い

plt.figure()とplt.subplots()を使用して、figureの1/4の範囲にグラフを描画してみます。(以下のコードは共通処理)

import numpy as np
import matplotlib.pyplot as plt

np.random.seed(0)

# 散布図
# 0~100のランダムな整数値を生成
x = [np.random.randint(0, 100) for i in range(200)]
y = [np.random.randint(0, 100) for i in range(200)]

plt.figure()による生成結果

fig = plt.figure()

ax1 = fig.add_subplot(2, 2, 1)
ax1.scatter(x, y)

plt.show()

plt.subplots()による生成結果

_, ax = plt.subplots(2, 2)
ax[0, 0].scatter(x, y)

plt.show()

plt.figure()は白紙のFigureの左上にaxesを1つ描画しているため、残りの部分は白紙のままです。一方、plt.subplots()は予め2×2のaxesを作成しているため、左上以外はデータの入っていないAxesが描画されました。

plt.figure()とplt.subplots()の使い分けとしては、以下のような感じでしょうか? plt.subplots()のほうがコード上はシンプルになりますので、まずはplt.subplots()で済ませられないか検討するのがいいのかもと思いました。

  • plt.figure():形式が定まっていない、もしくは柔軟性のあるFigureを描画したい場合に使用
  • plt.subplots():配置を事前に定義できる場合に使用

詳細は以下の公式サイトを参照ください。
Basic Usage – Matplotlib 3.5.2 documentation

コメントを残す

メールアドレスが公開されることはありません。