初心者でもPythonを使ってみよう

趣味と実益を兼ねたPython学習記

【スポンサーリンク】



【matplotlib.pyplot】subplotsを使ってグラフを描画する方法【Python】

subplotsでグラフを描画

subplots関数は複数のグラフの描画をする際に便利な関数で、各グラフの配置や軸の共通化設定をすることができます。

subplots関数は、以下のFigureオブジェクトとAxesオブジェクトを返します。

  1. Figure:グラフを描画するキャンバス全体のオブジェクト
  2. Axes:Figureオブジェクト内の個々のグラフのオブジェクト

以下に、4つのグラフを表示したときの例を示します。全体がFigreオブジェクトで、各グラフがAxesオブジェクトになります。

f:id:vigilantPotato:20190707174432p:plain

グラフ表示するデータの準備

まずは、グラフに表示させるデータを準備します。

import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 2*np.pi, 400)
y = np.sin(x**2)

公式ドキュメントのチュートリアルと同じデータです。このデータを、subplotsを用いて図示していきます。

グラフを一つ表示

subplotsを用いてFigureオブジェクトとAxesオブジェクトを生成し、グラフを表示させます。

fig, ax = plt.subplots()
ax.plot(x,y)

出力:

f:id:vigilantPotato:20190707174712p:plain

横に2つのグラフを並べて表示

横方向に複数のグラフを並べて表示するには、subplotsのncolsオプションで表示させるグラフの数を設定します。

先ほどの例ではsubplotからFigureオブジェクトとAxesオブジェクトが返されましたが、複数グラフを生成する場合はAxesオブジェクト自体ではなく、Axesオブジェクトのリストが返されます。そのため、個々のAxesオブジェクトにはAxes[0]のような形でアクセスします。

fig, ax = plt.subplots(ncols=2)
ax[0].plot(x, y)
ax[1].scatter(x, y)

出力:

f:id:vigilantPotato:20190707174727p:plain

左右に二つのグラフを表示させることができました。

縦に2つのグラフを並べて表示

縦方向に複数のグラフを並べて表示するには、subplotsのnrowsオプションで表示させるグラフの数を設定します。

fig, ax = plt.subplots(nrows=2)
ax[0].plot(x, y)
ax[1].scatter(x, y)

出力:

f:id:vigilantPotato:20190707174748p:plain

上下に二つのグラフを表示させることができました。

縦横に4つのグラフを並べて表示

nrowsとncolsの両方を設定することで、縦横両方向にグラフを並べることもできます。

この場合、各axesオブジェクトにアクセスするには、axes[0,0]の様な形で指定します。

fig, ax = plt.subplots(nrows=2, ncols=2)
ax[0, 0].plot(x, y)
ax[0, 1].scatter(x, y)
ax[1, 0].bar(x,y)
ax[1, 1].fill(x,y)

出力:

f:id:vigilantPotato:20190707174801p:plain

4つのグラフを表示させることができました。

また、nrowsとncolsは明示する必要はないため、以下の様に記述しても問題ありません。 但し、必ずnrows→ncolsの順番にする必要はあります。

fig, ax = plt.subplots(2, 2)

[↑ 目次へ]

各グラフ間で軸を共有

sharexオプション、shareyオプションを用いて、subplotsで表示した複数グラフ間の軸を共有することができます。

以下の例で使用するデータは、グラフ描画の例と同じものを利用しています。

x軸を共有

すべてのグラフ間でx軸を共有にするには、subplotsのsharexオプションをTrueに設定します。

fig, ax = plt.subplots(ncols=2, sharex=True)
ax[0].plot(2*x, y)
ax[1].plot(x, y)

出力:

f:id:vigilantPotato:20190707174904p:plain

すべてのグラフのx軸が共有になりました。

y軸を共有

すべてのグラフ間でy軸を共有にするには、subplotsのshareyオプションをTrueに設定します。

fig, ax = plt.subplots(ncols=2, sharey=True)
ax[0].plot(x, 2*y)
ax[1].plot(x, y)

出力:

f:id:vigilantPotato:20190707174824p:plain

すべてのグラフのy軸が共有になりました。

横方向に並べたグラフの軸を共有

横方向に並べたグラフの軸を共有にするには、subplotsのsharexまたはshareyオプションをrowに設定します。

fig, ax = plt.subplots(2, 2, sharex="row")
ax[0, 0].plot(x, y)
ax[0, 1].plot(2*x, y)
ax[1, 0].plot(x, y)
ax[1, 1].plot(3*x, 2*y)
f:id:vigilantPotato:20190707175143p:plain

左右のグラフのx軸を共有にすることができました。

縦方向に並べたグラフの軸を共有

縦方向に並べたグラフの軸を共有にするには、subplotsのsharexまたはshareyオプションをcolに設定します。

fig, ax = plt.subplots(2, 2, sharex="col")
ax[0, 0].plot(x, y)
ax[0, 1].plot(2*x, y)
ax[1, 0].plot(x, 2*y)
ax[1, 1].plot(2*x, 2*y)

出力:

f:id:vigilantPotato:20190707231520p:plain

上下のグラフのx軸を共有にすることができました。

[↑ 目次へ]