【Python】matplotlibで1枚の画像に複数のグラフを描画する方法① -add_subplots()

matplotlibでは様々なグラフを描画でき、複数グラフをまとめて表示したいときもあると思います。今回は1枚の画像に複数のグラフを並べて表示する方法を紹介しようと思います。

複数グラフを並べて表示させるためにはmatplotlibでよく見かけるfigとaxesを活用してく必要があります。

FigureとAxesについて

matplotlibのサンプルコードをネットで見ていて、以下のようなコードを見かけませんか?

fig, ax = plt.subplots()

figはFigureのことで、描画領域の全体を指します。一方axはAxesのことで、1つ1つの図(プロット)を描画する領域を指します。

FigureとAxes

基本的にはまずFigureを作成して、その後Axesに描画するプロットを個別に指定していきます。

以下で、FigureとAxesを使って複数グラフを並べて描画する方法を紹介します。

FigureとAxesを個別に作る

まずはFigureとAxesを個別に作成する方法です。まずはサンプルコード全体を以下に示します。

import numpy as np
from matplotlib import pyplot as plt


np.random.seed(2018)

x = np.random.uniform(0, 100, 20)

y1 = x * np.random.uniform(1, 2, 20)
y2 = x * np.random.uniform(1, 3, 20)
y3 = x * np.random.uniform(1, 4, 20)
y4 = x * np.random.uniform(1, 5, 20)

fig = plt.figure()

ax = fig.add_subplot(2, 2, 1)
ax.scatter(x, y1)

ax2 = fig.add_subplot(2, 2, 2)
ax2.bar(x, y2)

ax3 = fig.add_subplot(2, 2, 3)
ax3.bar(x, y3)

ax4 = fig.add_subplot(2, 2, 4)
ax4.scatter(x, y4)

fig.show()
実行結果

この方法では、Figureを作成した後、add_subplot()でAxesを追加していきます。add_subplot()の引数は3つあり、以下の順で指定します。

add_subplot(縦方向のプロット数, 横方向のプロット数, 当該プロットの位置)

1つ目と2つ目の引数はFigure全体で見たときの想定プロット数を指定します。例えばadd_subplots(2, 3, x)としたとき、Figureを2×3の描画領域で分割したときの1つが当該プロットの領域として割り当てられます。

3つ目の引数はそのプロットを割り当てる位置を指定します。たとえば2×2のFigureを用意したとき、位置指定は下図のようになります。

プロット指定の順番

add_subplots()による描画領域の分割

全てのadd_subplots()で分割サイズを揃える必要はありません。例えば上のサンプルコードのようにすべてのadd_subplots()で(2, 2)の範囲で領域を分割すればきれいに4分割されますが、以下のようなパターンも可能です。

fig = plt.figure()

ax = fig.add_subplot(4, 2, 1)
ax.scatter(x, y1)

ax2 = fig.add_subplot(2, 2, 2)
ax2.bar(x, y2)

ax3 = fig.add_subplot(2, 2, 3)
ax3.bar(x, y3)

ax4 = fig.add_subplot(2, 2, 4)
ax4.scatter(x, y4)

fig.show()
1つだけ3×2のプロット領域

axのみ4×2で分割しました。なのでaxだけ縦方向に4つプロットが収まるサイズとなっています。ここから、この方法では全てのサブプロットは独立していることがわかります。

なので以下のようなコードではプロットが重なってしまいます。

fig = plt.figure()

ax = fig.add_subplot(3, 2, 4)
ax.scatter(x, y1)

ax2 = fig.add_subplot(2, 2, 2)
ax2.bar(x, y2)

ax3 = fig.add_subplot(2, 2, 3)
ax3.bar(x, y3)

ax4 = fig.add_subplot(2, 2, 4)
ax4.scatter(x, y4)

fig.show()
プロット領域によって重なる場合がある

まとめ

add_subplots()を使って複数グラフをまとめて表示する方法を紹介しました。

今回はFigureとAxesを分けて作成しましたが、matplotlibにはそれらをまとめて作成してプロットに描画していく方法もあるので、次回紹介します。

ではでは👋