#author("2019-04-19T14:04:48+09:00","default:Miyashita","Miyashita") #author("2020-10-16T13:13:23+09:00","default:Miyashita","Miyashita") *図作成時のFigure,Axesインスタンス生成についての整理 [#cea9fd11] **はじめに [#o1839053] 図作成の事前作業にあたるFigure・Axesインスタンス生成について,いくつかの方法が見られたので整理する.~ 図作成の事前作業にあたる Figure・Axes インスタンス生成について,いくつかの方法が見られたので整理する.~ ここではそれぞれfig,axとして格納する. インポートは下記の通り.~ #codeprettify(lang-python){{ 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オブジェクトを指定する方法である~ -Figure オブジェクトの中に Axes オブジェクトがある~ -Axes オブジェクトの中に Axis オブジェクトがある~ -plt.figure() や plt.subplots() は Figure (と Axes) インスタンスを生成する~ -plt.xxx はカレントの Figure または Axes に対して実行される~ -fig.xxx, ax.xxx はカレントではなく具体的に Figure または Axes オブジェクトを指定する方法である~ なお,1つのウィンドウに1つの図しか配置しない場合においても,ここではsubplotを使用して図を作成することとしている. なお,1つのウィンドウに1つの図しか配置しない場合においても,ここでは subplot を使用して図を作成することとしている. ** fig, ax = plt.subplots() 方式 [#le832919] FigureとAxesのインスタンスを同時に生成.~ Figure と Axes のインスタンスを同時に生成.~ #codeprettify(lang-python){{ fig, ax = plt.subplots(1,1) ax.plot(np.random.rand(100)) }} subplotsの中の数字は row, col で,他の方法でやっているように,%%plt.subplots(111)%%と省略できないので注意.~ これでは111個のAxesインスタンスが生成されてしまう.~ subplots の中の数字は row, col で,他の方法でやっているように,%%plt.subplots(111)%%と省略できないので注意.~ これでは111個の Axes インスタンスが生成されてしまう.~ 図を2つ以上配置する場合は #codeprettify(lang-python){{ fig, (ax1, ax2) = plt.subplots(2,1) ax1.plot(np.random.rand(100)) }} #codeprettify(lang-python){{ fig, ax = plt.subplots(2,1) ax[0].plot(np.random.rand(100)) % 2行2列の場合はax[0][0].plot()等となる }} のように,個別にAxesを割り当てる方法と,Axesの集合を配列に格納する方法がある. のように,個別に Axes を割り当てる方法と, Axes の集合を配列に格納する方法がある. ** plt.subplot() 方式 [#l5f2f325] subplotsと紛らわしいが,だいぶ違う.最もMATLABに近い方法に見える. subplots と紛らわしいが,だいぶ違う.最も MATLAB に近い方法に見える. #codeprettify(lang-python){{ plt.figure() plt.subplot(211) # カレントのFigureオブジェクトを対象 plt.plot(np.random.rand(100)) # カレントのAxesオブジェクトについてplotの実行 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オブジェクトのメソッドを使うことが多いため,個人的にこの方法は採用していない. 最初の plt.figure() は書かなくても良い.figure がひとつもなければ作成する.この点が MATLAB と同じ考え方.~ その都度アクティブな Figure オブジェクト,Axes オブジェクトから描くため,fig, ax が不要.~ 体裁を整える時になんだかんだで Axes オブジェクトのメソッドを使うことが多いため,個人的にこの方法は採用していない. ** fig = plt.figure() → ax = fig.add_subplot() 方式 [#pb373414] オブジェクト指向に沿った方法その2. #codeprettify(lang-python){{ 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()は必須.~ plt.subplots() と異なり,Axes のインスタンスを1つずつ生成する.また,fig.subplot() なので fig = plt.figure() は必須.~ オブジェクトを明示するため,生成すれば記述する順番はどうでも良い.~ 比較的自由が利く. #codeprettify(lang-python){{ # 上記と同じ 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)) }} **その他 [#g08b3f30] 他にも,plt.subplot()からAxesインスタンスを生成してそのメソッドを使う方法もあるが,2つの手法が混ざっているよう. 他にも,plt.subplot() から Axes インスタンスを生成してそのメソッドを使う方法もあるが,2つの手法が混ざっているよう. #codeprettify(lang-python){{ # 非推奨なやり方 fig = plt.figure() ax = plt.subplot(111) # カレントのFigureオブジェクトからAxesインスタンスの生成 ax.plot(np.random.rand(100)) # axのメソッドを使用 ax = plt.subplot(111) # カレントの Figure オブジェクトから Axes インスタンスの生成 ax.plot(np.random.rand(100)) # ax のメソッドを使用 }} また,下記のようにfig, axを取得することもできる. また,下記のように fig, ax を取得することもできる. #codeprettify(lang-python){{ fig = plt.gcf() ax = plt.gca() }} ただし gcf や gca を使用する時点で,その前に取得すべき箇所があったはずで,原則的にはこれらを使用しないコードの方がスマートである.~ 例外的に,関数の内部で取得するときや引数として放り込む時にはあっても良いような. ***参考 [#z19e286f] -[[matplotlib.pyplot.figure>https://matplotlib.org/api/_as_gen/matplotlib.pyplot.figure.html]]~ -[[matplotlib.pyplot.subplots>https://matplotlib.org/api/_as_gen/matplotlib.pyplot.subplots.html]]~ -[[matplotlib.pyplot.subplot>https://matplotlib.org/api/_as_gen/matplotlib.pyplot.subplot.html]]~ -[[matplotlib入門 りんごがでている>http://bicycle1885.hatenablog.com/entry/2014/02/14/023734]]~ -[[MATLABユーザのためのPythonグラフ作成ツールmatplotlib入門 MyEnigma>http://myenigma.hatenablog.com/entry/2015/08/30/223559]]~ -[[早く知っておきたかったmatplotlibの基礎知識、あるいは見た目の調整が捗るArtistの話 - Qiita>https://qiita.com/skotaro/items/08dc0b8c5704c94eafb9]]~