Pythonでのプロットと可視化(matplotlib編) 〜 2.図とサブプロット

前回「Pythonでのプロットと可視化(matplotlib編) 〜 1.基本と概要」の続き。

今回は、グラフを描くためのスペースを用意し、その中に複数の座標を用意してグラフを描くことが目的。

まずは次のコード。

#coding:utf-8
import matplotlib.pyplot as plt

### 1.新しいウィンドウ(描画領域を作成するためのスペース)を作成する
fig = plt.figure() #新しいウィンドウ(描画領域を作成するためのスペース)の作成

### 2.ウィンドウに描画領域を作成する
ax1 = fig.add_subplot(2,2,1) #ウィンドウに描画領域を作成(レイアウトを2×2にして4つの描画領域を作成し、1つ目に描画する)
ax2 = fig.add_subplot(2,2,2) #ウィンドウに描画領域を作成(レイアウトを2×2にして4つの描画領域を作成し、2つ目に描画する)

これを実行すると次図のようにウィンドウと描画領域が作成される。

次に、plt.plot([1.5, 3.5, -2, 1.6])を実行する。
ソースは次。

#coding:utf-8
import matplotlib.pyplot as plt

### 1.新しいウィンドウ(描画領域を作成するためのスペース)を作成する
fig = plt.figure() #新しいウィンドウ(描画領域を作成するためのスペース)の作成

### 2.ウィンドウに描画領域を作成する
ax1 = fig.add_subplot(2,2,1) #ウィンドウに描画領域を作成(レイアウトを2×2にして4つの描画領域を作成し、1つ目に描画する)
ax2 = fig.add_subplot(2,2,2) #ウィンドウに描画領域を作成(レイアウトを2×2にして4つの描画領域を作成し、2つ目に描画する)

### 3.plotしてみる
plt.plot([1.5, 3.5, -2, 1.6])

実行結果は、次図になる。
つまり、matplotlibは使用した図やサブプロットの中で最後のものに描画する

ここで、「グラフを描く描画領域を明示的に指定は出来ないのか?」という疑問が浮かぶ。
※)出来ないなら、サブプロットを描いた段階でグラフ作成しなければならないことになる。
結論から言うと「出来る」
そのためには、fig.add_subplotの戻り値(描画領域のオブジェクト)を使用してplotを実行すれば良い。

例えば、ax1にplotする場合は次のようにする。

#coding:utf-8
import matplotlib.pyplot as plt

### 1.新しいウィンドウ(描画領域を作成するためのスペース)を作成する
fig = plt.figure() #新しいウィンドウ(描画領域を作成するためのスペース)の作成

### 2.ウィンドウに描画領域を作成する
ax1 = fig.add_subplot(2,2,1) #ウィンドウに描画領域を作成(レイアウトを2×2にして4つの描画領域を作成し、1つ目に描画する)
ax2 = fig.add_subplot(2,2,2) #ウィンドウに描画領域を作成(レイアウトを2×2にして4つの描画領域を作成し、2つ目に描画する)

ax1.plot([1.5, 3.5, -2, 1.6])

それでは、ax1のplot結果を変更することは可能なのか
結論から言うと、変更は出来ない。元の描画結果を残したまま、新しい描画を実施してしまう。

例えば、次のコードでax1にヒストグラムを描いてみる。

#coding:utf-8
import numpy as np
import matplotlib.pyplot as plt

### 1.新しいウィンドウ(描画領域を作成するためのスペース)を作成する
fig = plt.figure() #新しいウィンドウ(描画領域を作成するためのスペース)の作成

### 2.ウィンドウに描画領域を作成する
ax1 = fig.add_subplot(2,2,1) #ウィンドウに描画領域を作成(レイアウトを2×2にして4つの描画領域を作成し、1つ目に描画する)
ax2 = fig.add_subplot(2,2,2) #ウィンドウに描画領域を作成(レイアウトを2×2にして4つの描画領域を作成し、2つ目に描画する)

### 3.描画実行
ax1.plot([1.5, 3.5, -2, 1.6])
ax1.hist(np.random.randn(100), bins=20, color='k', alpha=0.3)

更新は失敗。
fig.add_subplotの戻り値はAxesSubplotオブジェクトで、そのオブジェクトの要素?を変更しなければ、一度描画した結果は変わらない仕様なのだろう。

次は、複数のsubplotを一度に作成する。それには、plt.subplotsを使用してサブプロットオブジェクトを要素に持つNumPy配列を取得する。

例えば、ウィンドウを新規に作成、そこに2×3のレイアウトで6つの描画領域を作成するには次のようにする。

axes = plt.subplots(2, 3)

「print axes」を実行すると、それぞれの要素はsubplotになっている。

[
[

]
[

]
]

その為、例えば上段左端のsubplotはaxes[0][0]で取得できる。
plt.subplots(2, 3)を実行して新しいウィンドウを作成し、上段左端と下段右端にグラフを描くコードは次。
※)これまでのソースもあえて残している。plt.subplots実行以降の処理は4と5。

#coding:utf-8
import numpy as np
import matplotlib.pyplot as plt

### 1.新しいウィンドウ(描画領域を作成するためのスペース)を作成する
fig = plt.figure() #新しいウィンドウ(描画領域を作成するためのスペース)の作成

### 2.ウィンドウに描画領域を作成する
ax1 = fig.add_subplot(2,2,1) #ウィンドウに描画領域を作成(レイアウトを2×2にして4つの描画領域を作成し、1つ目に描画する)
ax2 = fig.add_subplot(2,2,2) #ウィンドウに描画領域を作成(レイアウトを2×2にして4つの描画領域を作成し、2つ目に描画する)

### 3.描画実行
ax1.hist(np.random.randn(100), bins=20, color='k', alpha=0.3)
ax2.scatter(np.arange(30), np.arange(30)+3*np.random.randn(30))

### 4.複数サブプロットを作成する(新規にウィンドウが作成される)
fig, axes = plt.subplots(2, 3)

### 5.上段左端と下段右端にグラフを描く
axes[0][0].plot([1.5, 3.5, -2, 1.6])
axes[1][2].scatter(np.arange(30), np.arange(30)+3*np.random.randn(30))

実行結果は次図。

以上。

Pythonによるデータ分析入門 ―NumPy、pandasを使ったデータ処理

Pythonによるデータ分析入門 ―NumPy、pandasを使ったデータ処理