Python

Python:可視化(plt.subplots)

スポンサーリンク

はじめに

これまでは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つの図に複数のグラフを描いたときに、左右に異なるスケールの軸を設定する方法を扱います。

コメント

タイトルとURLをコピーしました