Python

Matplotlibで複数のグラフを並べて比較する方法

By 2021年5月19日No Comments

Matplotlibで作成したグラフを並べて比較したいと思ったことはありませんか?

ひとつずつグラフを作成して並べることもできますが、グラフの大きさを合わせるのが難しかったり、無理やりグラフを縦横に伸ばしたりする必要が出てくるかもしれません。

この記事ではMatplotlibを使って複数のグラフをひとつのプログラムで作成する方法について解説していきます。

Udemyの動画学習でもPythonを勉強しよう!

「平日の夜の勉強会には時間が間に合わなくて参加できない」「通勤時間のわずかな隙間時間を勉強時間にあてたい」「本ではよく分からないところを動画で理解を深めたい」そんなあなたはUdemyの動画学習がお勧めです!

UdemyのPythonおすすめ33講座レビューリスト

subplotの考え方

Matplotlibライブラリのsubplotを使うことで、一つのグラフを描く領域を分割して、それぞれのサブ領域でグラフを作成することができます。subplotを使うには3つの引数を渡します。例に示すように、行の数、列の数、割り当てる位置(左上から右下へ順)の引数を渡します。

import numpy as np  # numpyをnpとしてインポートします。
import matplotlib.pyplot as plt  # matplotlib.pyplotをpltとしてインポートします。

for i in range(1, 5):  # for文で2行2列のsubplotを作成します。
    plt.subplot(2, 2, i)  # 2行2列なので引数の1つ目と2つ目は2になります。
    plt.text(0.5, 0.5, str((2, 2, i)), ha = 'center')

plt.show()  # グラフを出力します。

グラフを2つ並べる方法

subplotのアプローチでは、内側のプロットにx軸、y軸のラベルを表示したくないときに、操作が難しくなります。こうした状況では、plt.subplots()を使います。(subplotのあとにあるsに注意してください)以降、plt.subplotsを用います。基本的な考え方はsubplotと変わりません。

2つのグラフを表示させる際には、plt.figure()でインスタンスを作成します。その図のインスタンスに複数のグラフを出力します。

fig = plt.figure()
axes = fig.subplots()

でグラフを表示させる領域を指定することができます。

最初のうちはこの構文を書けば複数のグラフを表示させることができると理解してもらえれば大丈夫です。少し踏み入ると、この考え方はオブジェクト指向によります。plt.figure()で作成したインスタンスの上にfig.subplots()で作成したグラフを乗せるイメージです。

まずは縦にグラフを2つ並べる方法です。

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, 2*np.pi, 100)
fig = plt.figure()
axes = fig.subplots(2, 1)

axes[0].plot(x, np.sin(x))
axes[1].plot(x, np.cos(x))

plt.show()

横にグラフを2つ並べるには1行2列でfig.subplots(1, 2)と設定します。

結果は以下のようになります。

棒グラフや散布図など好きなグラフを並べることもできます。

axes[].set_labelを用いて各グラフのラベルを設定しています。

import numpy as np
import matplotlib.pyplot as plt

fig = plt.figure()
axes = fig.subplots(2, 1)

# 上のグラフ(散布図)
x1 = np.linspace(0, 100, 100)
y1 = np.random.rand(100)

axes[0].scatter(x1, y1)  # 散布図を作ります。
axes[0].set_xlabel('x1')
axes[0].set_ylabel('y1')

# 下のグラフ(棒グラフ)
x2 = np.array(['a', 'b', 'c', 'd', 'e'])
y2 = np.array([98, 43, 18, 82, 45])

axes[1].bar(x2, y2)  # 棒グラフを作ります。
axes[1].set_xlabel('x2')
axes[1].set_ylabel('y2')
fig.tight_layout() # ラベルが他のグラフと重ならないように配置してくれます。
plt.show()

縦横に2つずつグラフを並べる方法

縦横に2つずつグラフを並べるには描画できる領域を2行2列に分割するので

axes = fig.subplots(2, 2)とします。

import numpy as np
import matplotlib.pyplot as plt

fig = plt.figure()
axes = fig.subplots(2, 2)

# 左上のグラフ(散布図)
x1 = np.linspace(0, 100, 100)
y1 = np.random.rand(100)

axes[0, 0].scatter(x1, y1)  # 散布図を作ります。
axes[0, 0].set_xlabel('x1')
axes[0, 0].set_ylabel('y1')

# 右上のグラフ(棒グラフ)
x2 = np.array(['a', 'b', 'c', 'd', 'e'])
y2 = np.array([98, 43, 18, 82, 45])

axes[0, 1].bar(x2, y2)  # 棒グラフを作ります。
axes[0, 1].set_xlabel('x2')
axes[0, 1].set_ylabel('y2')
# 左下のグラフ(折れ線グラフ)
x3 = np.array([1, 2, 3, 4, 5])
y3 = np.array([75, 47, 63, 84, 92])

axes[1, 0].plot(x3, y3)  # 折れ線グラフを作ります。
axes[1, 0].set_xlabel('x3')
axes[1, 0].set_ylabel('y3')

# 右下のグラフ
x = np.random.normal(50, 10, 1000)
axes[1, 1].hist(x, bins=10) # ヒストグラムを作ります。
axes[1, 1].set_xlabel('x4')
axes[1, 1].set_ylabel('frequency')
fig.tight_layout() # ラベルが他のグラフと重ならないように配置してくれます。
plt.show()

まとめ

今回はMatplotlibを使って複数のグラフを並べる方法について解説しました。これらの方法をマスターすることで、グラフをまとめる手間がかなり軽減されるのでぜひ試してみてください。

Udemyの動画学習でもPythonを勉強しよう!

「平日の夜の勉強会には時間が間に合わなくて参加できない」「通勤時間のわずかな隙間時間を勉強時間にあてたい」「本ではよく分からないところを動画で理解を深めたい」そんなあなたはUdemyの動画学習がお勧めです!

UdemyのPythonおすすめ33講座レビューリスト
HOSL

Author HOSL

More posts by HOSL