YutaKa Notebook | Python徹底図解ブログ!

Python の文法やモジュール、Python関連のAPIについて画像・ソースコード付きで徹底解説!

matplotlib:subplot使い方まとめ

今回はmatplotlibで、subplot()で、一つの図の中に複数のグラフを並べる方法を紹介します。

公式ドキュメントを参考にしたので、興味のある方はチェックしてみて下さい。

はじめに

今回は、pyplot.subplot()を使用して、一つの図の中に複数のグラフを並べる方法を紹介します。

pyplotってなんだ?という方はこちらの記事もご覧ください! 

 

www.yutaka-note.com

subplot()の概要

pyplot.subplot()を使用すると、一つの図の中に複数の小さなプロット(サブプロット)を作成することができます。

例えば、こんなかんじです。

f:id:YutaKa:20200131144101p:plain

一つの図の中に、コンター(左側)と、曲線(右側)を出力しています。

仮にjupyter notebookでsubplot()を使用しないと、こうなります。 

f:id:YutaKa:20200102224306p:plain

縦にズラーっと並びます。

subplot()を使うのと使わないのと、どちらが見やすいでしょうか?

subplot()使用の流れ

次の2ステップを繰り返すことで、一つの図の中にグラフを追加していきます。

subplotの使い方

① subplot()でグラフを追加する場所を指定する
② グラフを作成する

→ 別の場所を指定して、①、②を繰り返す

subplot()で場所を指定した後は、次の指定があるまで、現在のサブプロットがアクティブになります。

この状態でグラフを作成・編集すると、アクティブなサブプロットでグラフが作成・編集されます。

subplot()での場所の指定

subplot()の場所は、引数で指定します。

私は次の方法がオススメです。

%matplotlib inline
import matplotlib.pyplot as plt

# サブプロットで場所の指定 plt.subplot(LMN) # L、M、Nは、それぞれ一桁の正数 

ここで、subplot(LMN)は、図の領域を縦にL個、横にM個に分割して、左上から数えてN番目の領域を指定するということを意味します。

縦に2分割(L = 2)、横に3分割(M = 3)した場合の、 各サブプロットの場所を図にすると、次のようになります。

f:id:YutaKa:20200102223532p:plain
subplot(231)は左上、subplot(236)は右下になりますね。

このように、subplot()の引数で分割の仕方と場所を指定します。

subplot()の使用例

次の sin と cos 関数を例にいくつか使用例を紹介します。

import numpy as np
x = np.linspace(0, 3*np.pi, 100)
y1 = np.sin(x)
y2 = np.cos(x)

横軸は [0, 3π] を100等分した数列 x です。 縦軸は y1 = sin(x) 、 y2 = cos(x) とします。

 例1)グラフを縦に並べる

次のコードを実行すると、縦にグラフを2つ並べて表示できます。

subplotの引数に注目しながらコードを見てください。

# 図のサイズを決める 
plt.figure(figsize=(5,5))

# 1つ目のグラフ
plt.subplot(211)
plt.plot(x, y1)

# 2つ目のグラフ
plt.subplot(212)
plt.plot(x, y2, 'r--')

出力結果はこちらです。1つの図の中に縦に2つ並んでいます。

f:id:YutaKa:20200131143641p:plain

 例2)グラフを横に並べる

次のコードを実行すると、横にグラフを2つ並べて表示できます。

subplotの引数に注目しながらコードを見てください。

# 横に並べる
plt.figure(figsize=(12,5))

# 1つ目のグラフ
plt.subplot(121)
plt.plot(x, y1)
plt.title("sin curve")
plt.xlabel("x")
plt.ylabel("y")

# 2つ目のグラフ
plt.subplot(122)
plt.plot(x, y2, 'r--')
plt.title("cos curve")
plt.xlabel("x")
plt.ylabel("y")

出力結果はこちらです。1つの図の中に横に2つ並んでいます。

f:id:YutaKa:20200131144014p:plain

 例3)グラフを縦横に並べる

次のコードを実行すると、縦横それぞれにグラフを2つ並べて表示できます。

subplotの引数に注目しながらコードを見てください。

# 縦横に並べる
plt.figure(figsize=(12,5))

# 1つ目のグラフ
plt.subplot(221)
plt.plot(x, y1)

# 2つ目のグラフ
plt.subplot(222)
plt.plot(x, y2, 'r--')

# 3つ目のグラフ
plt.subplot(223)
plt.plot(x, y1**2, "g.")

# 4つ目のグラフ
plt.subplot(224)
plt.plot(x, y2**2, 'c-.')

出力結果はこちらです。1つの図の中に4つ並んでいます。

f:id:YutaKa:20200131143936p:plain

 応用編:異なるサイズのグラフを並べる

subplot()の領域指定を工夫することで、サイズの異なるグラフを一つの図の中に表示することもできます。

# 複雑に並べる
# 標準正規分布を計算する関数 def f_norm(x): return 1/np.sqrt(2*np.pi)*np.exp(-0.5*x**2)
# xとyの値を準備 x = np.linspace(-2, 2, 100) y = np.linspace(-2, 2, 100)
# z は正規分布の積 z = np.tensordot( f_norm(x), f_norm(y), axes=0)
# 左半分にコンター plt.figure(figsize=(10,5)) plt.subplot(121) plt.contourf(x,y,z)
# 右半分にプロット plt.subplot(322) plt.plot(y,z[30,:], "--") plt.ylim(0,0.2) plt.subplot(324) plt.plot(y,z[50,:], "r") plt.ylim(0,0.2) plt.subplot(326) plt.plot(y,z[90,:], "c-.") plt.ylim(0,0.2)

出力結果は初めの例のものです。

f:id:YutaKa:20200131144044p:plain
ここで、ポイントになるのは右側のsubplotの指定の仕方です。

コンター図で使用した領域を避けるように、右側の領域を指定しています。

f:id:YutaKa:20200102230005p:plain

ここで一つ注意です!

Note!

使用済みの領域を指定すると、先に描いていたグラフは表示されない!

上の例では、コンター図で使用している領域 (321)、(323)、(325)にグラフを追加してしまうと、コンター図は表示されなくなります!

f:id:YutaKa:20200131144143p:plain
後から追加したグラフが優先されて、上書きしてしまうようです。

まとめ

今回はmatplotlibで、subplot()を用いて、一つの図の中に複数のグラフを並べる方法を紹介しました。

subplotの使い方

① subplot()でグラフを追加する場所を指定する
② グラフを作成する

→ 場所を別の場所を指定して、①、②を繰り返す

引数は、subplot(LMN)という形で与えて、グラフの領域を縦にL個、横にM個に分割して、左上からN番目の位置を指定するということを意味する!

あとは、アクティブなサブプロットでグラフを作成、編集しましょう!