図作成時のFigure,Axesインスタンス生成についての整理

はじめに

図作成の事前作業にあたる Figure・Axes インスタンス生成について,いくつかの方法が見られたので整理する.
ここではそれぞれfig,axとして格納する. インポートは下記の通り.

import numpy as np
import matplotlib.pyplot as plt

以下のことを頭に入れておくことで,理解がスムーズになると思う.

  • Figure オブジェクトの中に Axes オブジェクトがある
  • Axes オブジェクトの中に Axis オブジェクトがある
  • plt.figure() や plt.subplots() は Figure (と Axes) インスタンスを生成する
  • plt.xxx はカレントの Figure または Axes に対して実行される
  • fig.xxx, ax.xxx はカレントではなく具体的に Figure または Axes オブジェクトを指定する方法である

なお,1つのウィンドウに1つの図しか配置しない場合においても,ここでは subplot を使用して図を作成することとしている.

fig, ax = plt.subplots() 方式

Figure と Axes のインスタンスを同時に生成.

fig, ax = plt.subplots(1,1)
ax.plot(np.random.rand(100))

subplots の中の数字は row, col で,他の方法でやっているように,plt.subplots(111)と省略できないので注意.
これでは111個の Axes インスタンスが生成されてしまう.
図を2つ以上配置する場合は

fig, (ax1, ax2) = plt.subplots(2,1)
ax1.plot(np.random.rand(100))
fig, ax = plt.subplots(2,1)
ax[0].plot(np.random.rand(100)) % 2行2列の場合はax[0][0].plot()等となる

のように,個別に Axes を割り当てる方法と, Axes の集合を配列に格納する方法がある.

plt.subplot() 方式

subplots と紛らわしいが,だいぶ違う.最も MATLAB に近い方法に見える.

plt.figure()
plt.subplot(211) # カレントの Figure オブジェクトを対象
plt.plot(np.random.rand(100)) # カレントの Axes オブジェクトについて plot の実行
plt.subplot(212)
plt.plot(np.random.rand(100))

最初の plt.figure() は書かなくても良い.figure がひとつもなければ作成する.この点が MATLAB と同じ考え方.
その都度アクティブな Figure オブジェクト,Axes オブジェクトから描くため,fig, ax が不要.
体裁を整える時になんだかんだで Axes オブジェクトのメソッドを使うことが多いため,個人的にこの方法は採用していない.

fig = plt.figure() → ax = fig.add_subplot() 方式

オブジェクト指向に沿った方法その2.

fig = plt.figure()
ax1 = fig.add_subplot(211) # figのメソッドを使用
ax1.plot(np.random.rand(100)) # axのメソッドを使用
ax2 = fig.add_subplot(212)
ax2.plot(np.random.rand(100))

plt.subplots() と異なり,Axes のインスタンスを1つずつ生成する.また,fig.subplot() なので fig = plt.figure() は必須.
オブジェクトを明示するため,生成すれば記述する順番はどうでも良い.
比較的自由が利く.

# 上記と同じ
fig = plt.figure()
ax1 = fig.add_subplot(211)
ax2 = fig.add_subplot(212)
ax1.plot(np.random.rand(100))
ax2.plot(np.random.rand(100))

その他

他にも,plt.subplot() から Axes インスタンスを生成してそのメソッドを使う方法もあるが,2つの手法が混ざっているよう.

# 非推奨なやり方
fig = plt.figure()
ax = plt.subplot(111) # カレントの Figure オブジェクトから Axes インスタンスの生成
ax.plot(np.random.rand(100)) # ax のメソッドを使用

また,下記のように fig, ax を取得することもできる.

fig = plt.gcf()
ax = plt.gca()

ただし gcf や gca を使用する時点で,その前に取得すべき箇所があったはずで,原則的にはこれらを使用しないコードの方がスマートである.
例外的に,関数の内部で取得するときや引数として放り込む時にはあっても良いような.

参考


Front page   Edit Diff Attach Copy Rename Reload   New List of pages Search Recent changes   Help   RSS of recent changes
Last-modified: 2018-02-02 (Fri) 12:48:21 (2275d)