最終更新日:2023/4/1

以下のように、1つの枠に複数のグラフを描画する方法を説明します。大きく2つの方法があります。状況に応じて使い分けます。
1つのグラフを描く方法を知りたい場合は、こちらのページを参照してください。

【説明すること】

1. 2つの方法の概要

大きく、(A)fig.add_subplot()の方法と(B)plt.subplots()の2つの方法があります。

どちらがいいかは状況によりますが、for文で連続的にグラフを並べたいという場合には、後者の方が便利です。

(A) fig.add_subplot()の方法(詳細はこちら)

最初にfigだけを用意して、後からその中に必要なグラフを場所を指定して貼り付ける方法です。

figとはfigureのことで真っ白なカンバスと考えましょう。 axは表示するグラフと考えましょう。詳細は後で触れますが、ざっくりとした違いは以下の通りです。

(B) plt.subplots()の方法(詳細はこちら)

カンバスと貼り付ける付箋を用意して、配列のように番号で指定して、グラフを貼り付けていく方法です。

2. fig.add_subplot()の方法

2.1 書き方

次の3ステップで作成します。


  1. fig1 = plt.figure()
    大きな白紙のカンバスを用意する。オプションのfigsize=(x,y)横幅(x)、高さ(y)の順番
  2. ax11= fig1.add_subpolot(n,m,z)
    fig1に貼る付箋となるax11を、「全体の行の数(n)、列の数(m)と自分の位置(z)」を指定して用意する。
  3. ax11.scatter(x1, y1)
    ax11の具体的なグラフを作成する。付箋の中身は、各axに対して、単独のグラフと同様に.plot().scatter()で指定します。

【2.についてもう少し詳しく】
コードの中で、ax11 = fig1.add_subplot(2,2,1)の()内の意味は、前半の2つで付箋のサイズ(行と列)を指定します。
最初の2が2行、次の2が2列で、2行2列の付箋(計4個)を作成する、ということで、最後の1がその中の1番目を指定する、という意味です。
1番目というのは、下の図のように、左上から1,2,3…と数えます。

※番号は「0スタートではない」点に注意しましょう。

figaxの関係、またaxの番号で指定した位置も、次の図(2行3列の場合)を参考にしてください。

figとaxの関係です。figは全体の1枚の白紙、その上に各付箋となるaxを貼り付けます。axは左上から1,2,3となり、右端で折り返し、3,4,5となります。
図2.1 figとaxの関係

2.2 fig.add_subplot()のコードの例1

次のコードを実行すると、各種のグラフを1つの枠に描くことができます。

全体のグラフのタイトル”Multi Graphs(1)”と、各axのタイトル”ax11″を、どこでどのように書いているかにも注目してください。

これらの見た目を変更する方法はこのページの後半で詳しく説明します。

図2.2 コードの実行結果(1)

3. plt.subplots()を使う方法

3.1 書き方

次の2ステップで作成します


  1. fig, ax = plt.subplots(2,3, figsize=[12, 4])
    figとaxのサイズを決めます。
    ここで、plt.subplots(2,3)の最初の2は2行、次の3は3列という意味です(計6個)。
    figsizeは全体の大きさを決めます。figsize=[x,y]は、横がx、縦がyのサイズとなります。
  2. ax[0,0].scatter(x,y)でそのaxに対するグラフを作成します。
    ax[0,0]は行番号=0,列番号=0という意味で、これは左上です。2行3列の場合、ax[1,2]が右下となります。上記の「図2.1 figとaxの関係」で位置関係を確認してください。

※.subplots()と最後に「s」がつく

この方法だとax[i,j]のように、配列の形式で書けるのでfor文で連続して描く場合に便利です。

3.2 コードの例2

次のコードを実行すると、各種のグラフを1つの枠に描くことができます。

全体のグラフのタイトル”Multi Graphs(2)”と、各axのタイトル”ax20[0,0]”を、どこでどのように書いているかにも注目してください。
これらのオプションについては、この後の 4.見た目を変更する方法で詳しく説明します。

図3.1 コードの実行結果(2)

4. 見た目を変更する方法(オプション)

ラベルや軸の範囲など、見た目を変更するオプションは、単独のグラフを描く場合とは異なることがあります。次の図は、その違いを表示したものです。

単独と同じか? “ax1.set_“の後に続けるか?この点に注目してください。
実は、5,6の「線」関係は同じで、それ以外は”ax1.set_“の後に続けます。

図4.1 複数と単独のオプションの指定方法の違い(★表をクリックで拡大)

5. よくあるエラー

ここではグラフ描画にありがちなエラーについて説明します。  

5.1 1行3列のfigにax[0,0]を指定してもエラーになる

これは2番目のplt.subplots()を使う方法で、axの構成が1行だけで、複数の列がある場合に起きます。
例えば「1行3列」の場合です。ax[0,0]と指定すれば、一番左が指定されるはずですが、うまくいきません。
実は、「1行」というのが解決のヒントになります。

具体的には以下の場合です。

【正しくないコード】

<実行結果>

IndexError: too many indices for array: array is 1-dimensional, but 2 were indexed

となりグラフが表示されません。なぜでしょう?

図5.1a 1行3列にax[0,n]と指定したエラー

【答え】

これは、1行に対してax[0,0]と、行と列を指定したからです。1行の場合には、その列番号だけ、つまりax[0]1つの変数で指定する必要があります。

【ポイント】
1行の場合はax[0]と1変数で指定する。2行以上の場合はax[0,0]と2変数で指定する。

それを踏まえた正しいコードが以下です。結果が正しく出力されています。

<実行結果>

図5.1b 正しい実行結果

ところで、このページの冒頭の変則的なグラフ(左は1つ、右は上下2つ)を描く場合はどのようにしたらいいのでしょうか?
このようなグラフの描き方は弊社の講義内で解説しています。