Matplotlibを使うときに真っ先に疑問符がつくのが、figureとaxesって何? ということかなと思います。この辺り、理解が曖昧でしたので整理してみました。
Matplotlibで作成されるグラフは大きくFigureとAxesの2つから構成されていて、役割としては以下です。
- Figure:描画する画像全体(画像キャンバス)
- Axes (Ax):個々のグラフ。Axはそれぞれ要素Axisを持ち、軸の情報を定義する
また、Figureの描画設定(視覚的な要素)は全て、Artistとして定義され、画像出力するときに読み込まれます。
下の図はざっくりとした構成イメージです。
FigureとAxesの作成
グラフを描画するには、(1)画像キャンバスFigureを作成、(2) 描画領域Axesを作成の手順を踏むことになります。やり方としては大きく2つです。
- plt.figure()によるFigureの作成
- 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