図作成時の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のインスタンスを同時に生成.plt.figure()を使わない,オブジェクト指向に沿った方法.

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 (348d)