Yamamoto's Laboratory
基本事項
複数のプロット

Matplotlib複数のプロット

Matplotlib のモジュール Pyplot を使いひとつのページに複数のプロットの作成方法を示します.

目次


基本事項

概要

Figure インスタンスを使った複数のプロットの大まかな作成手順は,以下のとおりです.

  1. pyplot モジュールをインポートします.コマンド例: import matplotlib.pyplot as plt
  2. Figure インスタンスを作成します.コマンド例: fig = plt.figure()
  3. 複数のプロットを作成します.プロットの数だけ以下を繰り返します.
    1. プロットのx軸とy軸,三次元の場合はz軸のデータを作成します.
    2. サブプロットを作成します.コマンド例: plot_11 = fig.add_subplot(2,2,1)
    3. 軸やタイトルなどを設定します.
    4. プロットを作成します(表示はされない).コマンド例: plot_11.plot(x1, y1, 'ro', markersize=5)
  4. プロットの間隔を調整します.コマンド例: fig.tight_layout()
  5. プロットを表示します.コマンド例: plt.show()
  6. 必要に応じて,プロットをファイルに保管します.コマンド例: fig.savefig('plot4.pdf')

matplotlib.pyplot.figure() は,Figure インスタンスを返します.matplotlib はライブラリーで,pyplot はモジュール,figure() は関数です.このFigure インスタンスは,プロット機能を提供します.

add_subplot() メソッドはその内部にサブプロットを作成します.

とりあえずプロット

Matplotlib を使った簡単な例を示します.三角関数 sin(x) のプロットです.

4個のプロットの表示

001   import numpy as np
002   import matplotlib.pyplot as plt
003   from mpl_toolkits.mplot3d import Axes3D
004   
005   fig = plt.figure()
006   
007   # ----- 第1プロット(左上) -----
008   x1 = np.linspace(-10, 10, 128)
009   y1 = np.sin(x1)
010   plot_11 = fig.add_subplot(2,2,1)
011   plot_11.set_title("$y=\sin(x)$")
012   plot_11.set_xlabel(r"$\theta$ [rad]", fontsize=12, fontname='serif')
013   plot_11.set_ylabel("Amplitude",       fontsize=12, fontname='serif')
014   plot_11.tick_params(axis='both', length=10, which='major')
015   plot_11.tick_params(axis='both', length=5,  which='minor')
016   plot_11.set_xlim([-10, 10])
017   plot_11.set_ylim([-1.2,1.2])
018   plot_11.minorticks_on()
019   plot_11.plot(x1, y1, 'ro', markersize=5)
020   
021   # ----- 第2プロット(右上) -----
022   x2 = np.linspace(-10, 10, 512)
023   y21 = np.sin(x2)
024   y22 = np.sin(x2)/x2
025   rec  = lambda x,n: 1.0/(2*n-1)*np.sin((2*n-1)*x)+rec(x,n-1) \
026          if 1<=n else 0
027   y23 = rec(x2, 10)
028   plot_12 = fig.add_subplot(2,2,2)
029   plot_12.set_xlabel(r"$\theta$ [rad]", fontsize=12, fontname='serif', \
030                  fontweight='bold')
031   plot_12.set_ylabel("Amplitude",       fontsize=12, fontname='serif', \
032                  fontweight='bold')
033   plot_12.tick_params(axis='both', length=10, which='major')
034   plot_12.tick_params(axis='both', length=5,  which='minor')
035   plot_12.set_xlim([-10, 10])
036   plot_12.set_ylim([-1.2,1.2])
037   plot_12.minorticks_on()
038   plot_12.plot(x2, y21, 'r-', markersize=5)
039   plot_12.plot(x2, y22, 'g-', markersize=5)
040   plot_12.plot(x2, y23, 'b-', markersize=5)
041   
042   # ----- 第3プロット(左下) -----
043   t = np.linspace(-np.pi, np.pi, 512)
044   y31 = np.sin(2*t)
045   y32 = np.cos(3*t)
046   plot_21 = fig.add_subplot(2,2,3)
047   plot_21.set_xlabel("Amplitude", fontsize=12, fontname='serif')
048   plot_21.set_ylabel("Amplitude", fontsize=12, fontname='serif')
049   plot_21.tick_params(axis='both', length=10, which='major')
050   plot_21.tick_params(axis='both', length=5,  which='minor')
051   plot_21.set_xlim([-1.2, 1.2])
052   plot_21.set_ylim([-1.2,1.2])
053   plot_21.minorticks_on()
054   plot_21.plot(y31, y32, 'b-', markersize=5)
055   
056   # ----- 第4プロット(右下) -----
057   x4 = np.linspace(-10, 10, 32)
058   y4 = np.linspace(-10, 10, 32)
059   x4_2D, y4_2D = np.meshgrid(x4, y4)
060   z4_2D = np.sin(np.sqrt(x4_2D**2+y4_2D**2))/np.sqrt(x4_2D**2+y4_2D**2)
061   plot_22 = fig.add_subplot(2,2,4, projection='3d')
062   plot_22.set_xlabel("x", fontsize=12, fontname='serif')
063   plot_22.set_ylabel("y", fontsize=12, fontname='serif')
064   plot_22.set_zlabel("z", fontsize=12, fontname='serif')
065   plot_22.tick_params(axis='both', length=10,  which='major')
066   plot_22.tick_params(axis='both', length=5,  which='minor')
067   plot_22.set_xlim([-10, 10])
068   plot_22.set_ylim([-10, 10])
069   plot_22.set_zlim([-1.2, 1.2])
070   plot_22.minorticks_on()
071   plot_22.plot_surface(x4_2D, y4_2D, z4_2D, rstride=1, cstride=1, \
072                    linewidth=0.5, edgecolors='black')
073   
074   # ----- スクリーン表示 -----
075   fig.tight_layout()
076   plt.show()
077   
078   # ----- pdf 作成 -----
079   fig.savefig('plot4.pdf', orientation='portrait', \
080                           transparent=False, bbox_inches=None, frameon=None)
081   fig.clf()
matplotlib の最も簡単なプログラムの結果
図1: 実行結果

このプログラムの動作は,以下のとおりです.Matplotlib でプロットしているコマンドは,009 — 010 に書かれています.

リスト行 動作の説明
003 numpy をインポートします.これがなくても,matplotlib は動作しますが,計算に便利なので,matplotlib と一緒に読み込まれることが多いです.
004 matplotlib.pyplot をインポートします.ほとんどのプロットはこのモジュールで描画可能です.
006 x を -π — π まで 360等分した配列とします.
007 y の値は,sin(x) の配列です.
009 プロットを作成します.
010 プロットを表示します.プログラムは,プロット(図1)が消去されるまで,動作停止します.

より深い情報

figure()関数

関数 matplotlib.pyplot.figure の引数は,次のとおりです.

matplotlib.pyplot.figure(num=None, figsize=None, dpi=None, facecolor=None,
      edgecolor=None, frameon=True, FigureClass=<class 'matplotlib.figure.Figure'>,
      **kwargs)
num
整数または文字列,オプション,デフォルト:なし.値を指定しない場合.新しい図が作成され,図番号がひとつ増えます.figure オブジェクトはこの数を `number` 属性で保持します.num が指定されていて、このIDを持つ Figure がすでに存在する場合は,それをアクティブにし,その ID への参照を返します.この図が存在しない場合は作成し,それを返します.num が文字列の場合,ウィンドウのタイトルはこの Figure の num になります.
figsize
整数のタプル(幅[インチ],高さ[インチ]),オプション,デフォルト:なし.指定されていない場合は,デフォルトで rc figure.figsizeになります.
dpi
図の分解能[dpi]を整数で指定します,オプション,デフォルト:なし.指定しない場合は,デフォルト rc figure.dpi です.
facecolor
バックグラウンドカラーの指定です.指定しない場合は,デフォルト rc figure.facecolor です.
edgecolor
境界色の指定です.指定しない場合は,デフォルト rc figure.edgecolor です.
frameon
False の場合には,図のフレームを描画しません.
FigureClass
カスタムの Figure インスタンスを使うことも可能です.
**kwargs
追加のkwargsがFigureのinit関数に渡されます.

戻り値の Figure インスタンスは,バックエンドの new_figure_manager にも渡されます.これにより,カスタム Figure クラスを Pylab インタフェースにフックできます.追加の kwargs が Figure の init 関数に渡されます。

クラス Figure

クラス Figure は,クラス Artist を継承しています.

ページ作成情報

参考資料

モジュール「pyplot.py」のソースコードが良い資料です.

更新履歴

2017年07月21日 新規作成


no counter