Yamamoto's Laboratory
基本事項
プロット作成
コンピューター Python ライブラリー Matplotlib 基本事項:プロット作成

Matplotlibプロット作成

Matplotlib.pyplot を使いプロットの作成方法を示します.

目次


はじめに

matplotlib を使うためには,matplotlib.pyplot インポートします.これ (matplotlib.pyplot) はプロットを作成するための関数の集合です.これに含まれる関数は,Figure (プロット領域) の作成やラベルの装飾,プロットの作成などの機能を提供します.要するに,matplotlib.pyplot インポートし,それに含まれる関数を使うとプロットの作成ができるということです.

プロット作成順序

matplotlib でのプロット作成順序を示します.

  1. まずは,ライブラリー「matplotlib.pyplot」をインポートします.matplotlib を使う準備です.通常は 「import matplotlib.pyplot as plt」 と記載します.
  2. 次に関数 figure() を呼び出して,描画領域 (Figure) を作成します.プロットする紙 (ページ) を用意する感じです.
    • ひとつの Figure に複数のプロットを作成する場合,関数 add_subplot() を呼び出します.これはひとつプロット作成にも使えます.
  3. プロットを作成します.
  4. プロットを表示します.
  5. 関数 savefig() を使いプロットを電子ファイルに保管します.

この WEB ページでは,プロットの作成方法の基礎と重要な三つの関数 (figure, add_subplot, savefig) を説明します.

プロットの基本

ここでは,Matplotlib を使ったプロット作成方法の基本を示します.具体的には,(1) matplotlib.pyplot の関数を使ったプロット作成方法,(2) add_subplot を使った複数プロット,(3) savefig を使ったプロットの保管方法です.これで,matplotlib が一通り使えると思います.

とりあえずプロット

プログラム例

Matplotlib を使った簡単なとても簡単なプロットの例を示します.三角関数 sin(x) をプロットするプログラム (sin.py) です.プロットの作成手順は,他のプログラミング言語と同じです.プロットするデータ (x, y) を準備し,Matplotlib で作図します.具体的には以下のとおりです.

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-np.pi, np.pi, np.pi/360)   # データ x の生成
y = np.sin(x)                             # データ y の生成

fig=plt.figure(1, facecolor='olive')
plt.xlim([-np.pi, np.pi])
plt.ylim(-1.2, 1.2)
plt.plot(x, y)
plt.show()

plt.clf()
plt.close()

このプログラムの動作は,以下のとおりです.Matplotlib のコマンド (関数) は,7 — 9 行です.

リスト行 動作の説明
1 numpy をインポートします.これがなくても,matplotlib は動作しますが,計算に便利なので,matplotlib と一緒に読み込まれることが多いです.
2 matplotlib.pyplot をインポートします.ほとんどのプロットはこのモジュールで描画可能です.
4 x を -π から π まで 360等分した配列とします.
5 y の値は,sin(x) の配列です.
7 Figure インスタンスを作成します.描画領域全体を確保します.
8 — 9 x軸とy軸の上限/下限を設定します.
10 プロットを作成します.
11 プロットを表示します.プログラムは,プロット(図1)が消去されるまで,動作停止します.
13 図 (Figure) をクリアーします.
14 図 (Figure) のウインドウを閉じます.

実行方法と結果

このプログラムは,実行コマンドは以下の通りです.

> python  sin.py       Windows の場合
$ python3 sin.py       Linux の場合

実行すると,以下のプロットが画面に現れます.その画面を消去すると,ファイル「sin.pdf」が作成されます.

図1: 実行結果

figure() について

figure() は matplotlib.pyplot の関数です.その引数は以下のとおりです.

figure(num=None, figsize=None, dpi=None,
       facecolor=None, edgecolor=None, frameon=True,
       FigureClass=<class 'matplotlib.figure.Figure'>,
       clear=False, **kwargs)

この関数の戻り値は,インスタンス: Figure を返します.このインスタンスはバックエンドの new_figure_manager にも渡されます.これにより,カスタム Figure クラスを pyplot インターフェースにフックできます.追加の kwargs が Figureinit 関数に渡されます.この関数の引数の動作は以下のとおりです.

引数 動作
num 整数 or 文字列.これが Figure の識別子になります.この識別子をもつ Figure がある場合,それがアクティブになりそれが返されるます.同じ識別子を持つ Figure が無いあるいは num が指定されていない場合、新しい図形が作成されます.そして,それがアクティブにされて返されます.num が int の場合は Figure.number属性に使用されます.それ以外の場合は,自動生成された整数値が使用されます (1から始まり新しい数字ごとに増分されます).num が文字列の場合,図のラベルとウィンドウのタイトルはこの文字列になります.
figsize 図のサイズ [幅, 高さ] 単位: インチ.デフォルト [6.4, 4.8].
dpi 図の解像度 (dots par inch).
facecolor 図の背景色.デフォルト: 'white'.
edgecolor 境界の色指定です.
frameon False の場合,図のフレームの線を描画しません.
FigureClass オプション: カスタム Figure インスタンスを使用します.
clear True かつ Figure が既にある場合,それがクリアーされます.
**kwargs いろいろな設定ができます.詳しくは別ページで.

注意

多くの図を作成する場合,使用していない図は明示的に pyplot.close を呼び出してクローズします.pyplot がメモリを適切にクリーンにします.

複数プロット (add_subplot)

前節で示した matplotlib.pyplot を使う方法だと,ひとつの描画領域にひとつのプロットとなります.実際の解析の現場では,これは不便なことが多いです.そこで,ひとつの描画領域 (1ページ) に複数のプロットを作成する add_subplot() を使う方法を示します.ひとつのプロットで用が足りる場合も同じ方法でプロットの作成ができます.この add_subplot を使う方法は広範囲に使える方法で,私はいつもこの方法でプロットを作成します.

複数プロットを作成するための関数として,subplot() や subplots() があります.私は add_subplot() を使います.

プログラム例と実行結果

add_subplot() を使い,ひとつのページに複数のプロットを配置した例を以下に示します.

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-2*np.pi, 2*np.pi, np.pi/720)    # データ x の生成
y = np.sin(x)                                  # データ y の生成

fig = plt.figure(1, facecolor='olive')

ax1 = fig.add_subplot(2 ,2 ,1)
ax1.set_xlim([-2*np.pi, 2*np.pi])
ax1.set_ylim([-1.2, 1.2])
ax1.plot(x, y)

ax2 = fig.add_subplot(2 ,2 ,2)
ax2.set_xlim([-2*np.pi, 2*np.pi])
ax2.set_ylim([-1.2, 1.2])
ax2.plot(x, y**2)

ax3 = fig.add_subplot(2 ,2 ,3)
ax3.set_xlim([-2*np.pi, 2*np.pi])
ax3.set_ylim([-1.2, 1.2])
ax3.plot(x, y**3)

plt.show()
plt.clf()
plt.close()

このプログラムの動作は,以下のとおりです.add_subplot() に関わるところだけ説明します.

リスト行 動作の説明
9 二行二列の4個のプロットの生成を宣言し,左上に軸 (サブプロット) を作成します.

図2: 実行結果

add_subplot() について

Figure.add_subplot() は,Figure に軸を追加します.その引数は,以下のとおりです.

add_subplot(nrows, ncols, index, **kwargs)

引数の動作は以下のとおりです.

引数 動作
nrows Axis (サブプロット) の行数です.
ncols Axis (サブプロット) の列数です.
index Axis (サブプロット) のインデクスです.左上 (1行1列) が 1 です.それから右に進むとインデックスが増えます.右端に達すると,ひとつ下の行の左端になります
**kwargs 様々な設定ができます.詳細は別途ページに示します.

プロットのファイル保管

プロットを電子ファイルにする理由

作成したプロットを報告書などのドキュメントファイルに挿入する場合,プロットをファイルにする必要があります.コピー & ペーストで貼り付けると,画像品質が劣化しますので,慎むべきです.高品質のドキュメントを作成するためには「プロットは電子ファイルにしそれを挿入せよ」ということです.今時のドキュメントは PDF にして配布するため,いくらでも拡大できます.元のファイルの品質が悪いと,拡大した時にボケます.

プログラム例と実行結果

以下にプロットを電子ファイルに保管するプログラム例を示します.

import numpy as np
import matplotlib.pyplot as plt

theta = np.arange(-np.pi, np.pi, np.pi/720)   # データ x の生成

fig=plt.figure(1, facecolor='olive')
plt.xlim(-1.2, 1.2)
plt.ylim(-1.2, 1.2)
plt.plot(np.sin(2*theta), np.sin(3*theta))
plt.show()
fig.savefig('Lissajous.pdf')

plt.clf()
plt.close()

図3: 作成されたファイル

savefig() について

savefig() は matplotlib.pyplot の関数です.その引数は以下のとおりです.

savefig(fname, dpi=None, facecolor='w', edgecolor='w',
      orientation='portrait', papertype=None, format=None,
      transparent=False, bbox_inches=None, pad_inches=0.1,
      frameon=None, metadata=None)

引数の動作は以下のとおりです.

引数 動作
fname 出力するファイルパスです.拡張子がある場合はフォーマットはその拡張子に従います.ない場合は引数の format で指定します.
dpi 解像度 [dot/inch] です.実数 or 'figure' を指定.後者の場合,'figure' の dpi 値になります.
facecolor プロットのフェイスカラーの設定です.
edgecolor figue のエッジの色指定です.デフォルトの figure の linewidth=0.0 です.エッジを表示するためには,matplotlib.pyplot.figure(linewidth=2)のようにします.
orientation 'landscape':横長, 'portrait':縦長.現在、ポストスクリプトバックエンドでのみサポートです.
papertype ペーパーの選択です.選択肢は ('letter', 'legal', 'executive', 'ledger', 'A0' &mdash 'A10', 'B0' — 'B10') です.ポストスクリプトの場合に有効です.
format 画像ファイルのフォーマット (例: 'png', 'pdf', 'svg', …) です.fname のファイル名の拡張子で指定も可能です.
transparent Trueの場合,Axes 領域はすべて透明になります.フェイスカラーやエッジカラーが kwargs で指定されていない限り,フィギュア領域も透明になります.これは Webページの色付きの背景の上にプロットを表示する場合に便利です. この関数を終了すると,これらの透明領域は元の値に復元されます.
bbox_inches インチ単位のバウンディングボックス:図の特定の部分のみが保存されます.'tight' の場合は、図のタイトな bbox を把握してみてください。
pad_inches bbox_inchesが 'tight' な場合の図の周りのパッディング (隙間) の量.
frameon True の場合,フィギュア領域は色付けされ,False の場合ではフィギュアの背景は透明になります.指定しない場合、rcParamの「savefig.frameon」が使用されます.
metadata 画像メタデータに保存するキーと値のペア.サポートされているキーとデフォルトは,画像形式とバックエンドによって異なります.'png': print_png, 'pdf': PdfPages, 'svg': print_svg.

ページ作成情報

参考資料

  1. YutaKaのPython教室Matplotlib plt.figure()を使う理由|FigureとAxesの関係を把握しよう は,Matplotlib の基本が分かり易いです.
  2. matplotlib.pyplot の関数の一覧は,「matplotlib.pyplot — Matplotlib 3.1.0 documentation」にあります.
  3. 具体例は,「matplotlibのpyplot APIをいろいろ試す - そうなんでげす」にたくさんあります.

更新履歴

2016年10月17日 新規作成


no counter