【Python】Matplotlibで複数のグラフを並べよう!

並べた棒グラフ

こんにちは!

皆さんはMatplotlibで作成したグラフを並べたことはありませんか?

複数のグラフを個別に作成して、パワーポイント等で使用する際に横に並べるといった方法を使う方もいるかと思います。

しかしそのような場合には、画像の管理が大変だったり、グラフの大きさが少し違ってイライラしてしまうことがあるかもしれません。

そこで今回は、Matplotlibを使用して複数のグラフを1つの画像に並べて出力する方法を紹介します。

棒グラフを用いてグラフを並べる方法を紹介していくので、棒グラフの描き方がわからない方は以下の記事をご覧ください。




1. 複数のグラフを並べて出力する方法

複数のグラフを並べて出力するには、まず初めに、「plt.figure()」で図のインスタンスを作成します。

その図のインスタンスに複数のグラフを出力します。

図のインスタンスに複数のグラフを出力するには、「add_subplot()」を使用します。

初心者の方はあまり意識しなくても良いのですが、この考え方はオブジェクト指向によるものみたいです。
figure()で作成したインスタンスの上にadd_subplot()で作成したグラフを乗せる感じです。

add_subplot()の書式は以下のようになります。

add_subplot(行数, 列数, 番号)

行数と列数でfig全体を何分割するかを指定します。
番号で分割したfigのどこにグラフを出力するか決定します。


2.横にグラフを並べる

横にグラフを並べる場合は、番号は左から順に1、2、3・・・となっています。

以下のプログラムは、横にグラフを並べて出力するプログラムです。

import matplotlib.pyplot as plt

x1, y1 = range(0, 3), [32, 12, 47]
x2, y2 = range(0, 3), [8, 38, 28]
label = ["A", "B", "C"]
fig = plt.figure()

ax1 = fig.add_subplot(1, 2, 1)   #1行2列の1番目
ax1.bar(x1, y1, tick_label=label)
ax1.set_title("title1")

ax2 = fig.add_subplot(1, 2, 2)   #1行2列の2番目
ax2.bar(x2, y2, tick_label=label)
ax2.set_title("title2")

plt.tight_layout()
plt.show()

実行結果

番号に1と指定したax1のグラフが左に、2と指定したax2のグラフが右に描かれていますね。


3. 縦にグラフを並べる

縦にグラフを並べる場合は、番号は上から順に1、2、3・・・となっています。

以下のプログラムは、縦にグラフを並べて出力するプログラムです。

import matplotlib.pyplot as plt

x1, y1 = range(0, 3), [32, 12, 47]
x2, y2 = range(0, 3), [8, 38, 28]
label = ["A", "B", "C"]
fig = plt.figure()

ax1 = fig.add_subplot(2, 1, 1)   #2行1列の1番目
ax1.bar(x1, y1, tick_label=label)
ax1.set_title("title1")

ax2 = fig.add_subplot(2, 1, 2)   #2行1列の2番目
ax2.bar(x2, y2, tick_label=label)
ax2.set_title("title2")

plt.tight_layout()
plt.show()

実行結果

番号に1と指定したax1のグラフが上に、2と指定したax2のグラフが下に描かれていますね。


4. 上に2つ、下に2つのグラフを並べる

縦横に複数のグラフを並べる場合は、番号は左上から右端まで進み、次は1段下がった左端から右端まで進み、これを繰り返していきます。

以下の図は、上に2つ、下に二つのグラフを並べる場合の番号です。

以下のプログラムは、上に2つ、下に2つのグラフを並べて出力するプログラムです。

import matplotlib.pyplot as plt

x1, y1 = range(0, 3), [32, 12, 47]
x2, y2 = range(0, 3), [21, 4, 29]
x3, y3 = range(0, 3), [2, 31, 42]
x4, y4 = range(0, 3), [14, 18, 3]

label = ["A", "B", "C"]
fig = plt.figure()

ax1 = fig.add_subplot(2, 2, 1)   #2行2列の1番目
ax1.bar(x1, y1, tick_label=label)
ax1.set_title("title1")

ax2 = fig.add_subplot(2, 2, 2)   #2行2列の2番目
ax2.bar(x2, y2, tick_label=label)
ax2.set_title("title2")

ax3 = fig.add_subplot(2, 2, 3)   #2行2列の3番目
ax3.bar(x3, y3, tick_label=label)
ax3.set_title("title3")

ax4 = fig.add_subplot(2, 2, 4)   #2行2列の4番目
ax4.bar(x4, y4, tick_label=label)
ax4.set_title("title4")

plt.tight_layout()
plt.show()

実行結果

番号に1と指定したax1のグラフが左上に、2と指定したax2のグラフが右上に、3と指定したax3のグラフが左下に、4と指定したax4のグラフが右下に描かれていますね。


5. 軸の値を合わせる、共有する

グラフを並べたときに、軸の値が下の図のように異なっていたら、パッと見ただけでは、両者にそこまで大きな違いがないように見えてしまいます。

そのためグラフを並べる時には、軸の値を合わせるか、軸を共有する方が視覚的に両者のグラフの特徴をつかみやすいです。

5.1 軸の値を合わせる

以下のプログラムはy軸の値を合わせるプログラムです。

import matplotlib.pyplot as  plt

x1, y1 = range(0, 3), [23, 39, 31]
x2, y2 = range(0, 3), [12, 20, 5]

label = ["A", "B", "C"]
fig = plt.figure()

ax1 = fig.add_subplot(1, 2, 1)
ax1.bar(x1, y1, tick_label=label)
ax1.set_title("title1")
ymin, ymax = plt.ylim()   #ax1のy軸の最大値、最小値を入手

ax2 = fig.add_subplot(1, 2, 2)
ax2.bar(x2, y2, tick_label=label)
ax2.set_title("title2")
plt.ylim(ymin, ymax) #ax2のy軸の範囲をax1のy軸の最大値、最小値に合わせる

plt.tight_layout()
plt.show()

実行結果

初めに、plt.ylim()で、ax1のy軸の最大値、最小値を入手します。
そして、plt.ylim(ymin, ymax)とすることで、ax2のy軸の範囲をax1のy軸の最大値、最小値に合わせます。

注意点は、ax1のy軸の範囲がax2のy軸の範囲よりも小さい場合には、ax2が正しく表示されなくなってしまう点です。


5.2 軸の値を共有する

以下のプログラムはy軸を共有するプログラムです。

import matplotlib.pyplot as  plt

x1, y1 = range(0, 3), [23, 39, 31]
x2, y2 = range(0, 3), [12, 20, 5]

label = ["A", "B", "C"]

#y軸を共有する、1行2列のサブプロットを追加する
fig, (ax1, ax2) = plt.subplots(nrows=1, ncols=2, sharey=True)

ax1.bar(x1, y1, tick_label=label)
ax1.set_title("title1")

ax2.bar(x2, y2, tick_label=label)
ax2.set_title("title2")

plt.tight_layout()
plt.show()

実行結果

軸の値を合わせる、または共有することによって、両者の違いがはっきりとわかるようになりましたね!


6. まとめ

いかがでしたか?
Matplotlibで複数のグラフを並べる方法について理解できたでしょうか?

Matplotlibでは、add_subplot()を使うことで、簡単に複数のグラフを並べることができるので是非試してみてください!


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です