はじめに
これまではAxesオブジェクトを作るときに、Figureオブジェクトを生成したあと、Axesオブジェクトを追加してplot()メソッドで描画する、という流れでグラフを生成してきました。
これに対して、はじめからFigureオブジェクトとAxesオブジェクトをまとめて作成するsubplots()を利用する、という方法があります。今回は、このsubplots()を扱います。
FigureとAxesオブジェクトをまとめて生成する
subplots()では、引数に行数、列数を指定することで、FigureオブジェクトとAxesオブジェクトを同時に生成することができます。
subplots()を実行すると、FigureオブジェクトとAxesオブジェクトの参照が戻り値として返されるので、次のように2つの変数で戻り値を受け取るようにします。
# ライブラリのインポート
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
# Figure/Axesオブジェクトの作成
fig,ax=plt.subplots(figsize=(10,6),nrows=3,ncols=3)
このコードでは変数axにAxesオブジェクトの参照を格納した2次元のリストが代入されます。3行3列のサブプロットを作成したので、各サブプロットには次のようにアクセスできます。
ax[0,0], ax[0,2], ax[0,3]
ax[1,0], ax[1,2], ax[1,3]
ax[2,0], ax[2,2], ax[2,3]
実際にグラフを描いてみましょう。
# Figure/Axesオブジェクトの作成
fig,ax=plt.subplots(figsize=(10,6),nrows=3,ncols=3)
# データ
x=np.linspace(0,10)
y1=np.sin(x)
y2=np.cos(x)
y3=x
y4=x**2
y5=x**3
y6=x**5
y7=1/x
y8=1/x**2
y9=1/x**3
# 描画
ax[0,0].plot(x,y1)
ax[0,1].plot(x,y2)
ax[0,2].plot(x,y3)
ax[1,0].plot(x,y4)
ax[1,1].plot(x,y5)
ax[1,2].plot(x,y6)
ax[2,0].plot(x,y7)
ax[2,1].plot(x,y8)
ax[2,2].plot(x,y9)
Axesを行ごとにリストにする
先ほどはAxesオブジェクトを2次元の配列にまとめて代入しましたが、行数と同じ数の変数を用意すると、Axesオブジェクトの参照を行単位で変数に代入することができます。
fig,(ax1,ax2)=plt.subplots(2,2,figsize=(10,6))
# データ
x=np.linspace(-10,10)
y1=np.sin(x)
y2=np.cos(x)
y3=x
y4=x**2
# 描画
ax1[0].plot(x,y1)
ax1[1].plot(x,y2)
ax2[0].plot(x,y3)
ax2[1].plot(x,y4)
軸の共有について(subplots()の場合)
subplots()には、sharex, shareyという引数があります。これが軸の共有を設定する引数ですが、与える値によって挙動が異なります。
- sharex
True(‘all’):すべてのx軸が共有される
False(‘none’):軸を共有しない
‘row’:同じ行のグラフで軸を共有する
‘col’:同じ列のグラウで軸を共有する - sharey
True(‘all’):すべてのx軸が共有される
False(‘none’):軸を共有しない
‘row’:同じ行のグラフで軸を共有する
‘col’:同じ列のグラウで軸を共有する
ここに記載したように、x軸だとしても横並びで軸を共有することができるし、y軸だとしても縦方向に軸を共有することができます。
※x軸だと縦方向、y軸だと横方向に軸を共有したい、というのが普通だと思いますが、こういう利用シーンもときにはありますよね。
これも例を見ておきましょう。x軸もy軸も同じような挙動になるので、ここではx軸に関する例とします。
import matplotlib.pyplot as plt
import numpy as np
x1 = np.linspace(0, 10)
x2 = np.linspace(-5,5)
for p in [False, True, "row", "col"]:
fig, ax = plt.subplots(2, 2, sharex=p, figsize=(6, 6), facecolor="w")
fig.suptitle("sharex='{}'".format(p), y=0.92)
ax[0,0].plot(x1, np.sin(x1))
ax[0,1].plot(x1, np.cos(x1))
ax[1,0].plot(x2, x2**2)
ax[1,1].plot(x2, -x2**2)
sharex=Falseでは、どのグラフもx軸を共有していません。
sharex=Trueでは、すべてのグラフでx軸が共有されています。
sharex=’row’では、行方向でx軸を共有します。※横方向
sharex=’col’では、列方向に軸を共有します。※縦方向
まとめ
いかがでしたでしょうか?だいぶややこしい話も出てきましたが、これだけできれば、グラフを描いて比較することができるので、データ分析が捗りますね。次回は、1つの図に複数のグラフを描いたときに、左右に異なるスケールの軸を設定する方法を扱います。
コメント