😎

[Matplotlib入門シリーズ第5回] サブプロットで複数グラフの配置

に公開

はじめに

本記事は「Pythonでデータを可視化するMatplotlib入門」シリーズの第5回です.

前記事までは,1つのグラフをわかりやすく描画する方法を学んできました.

本記事では1枚の図に複数のグラフを配置する方法を説明します.

私のMatplotlibライブラリのバージョンは "3.7.0" です.

本シリーズの構成

本シリーズの構成予定(全11記事)は以下を想定しています.

  1. Matplotlibのインストール 〜 線グラフの描画
  2. 基本的な2次元プロット(線グラフ・点グラフ・複数データ・グラフの見た目)
  3. グラフ装飾(タイトル・軸・凡例・グリッド・表示範囲)
  4. 様々なグラフ(ヒストグラム・散布図など)
  5. サブプロット(本記事)
  6. 2次元図形の描画(公開後にリンクを追加する予定)
  7. 画像表示とヒートマップ(公開後にリンクを追加する予定)
  8. 3次元プロット(公開後にリンクを追加する予定)
  9. 3次元図形の描画(公開後にリンクを追加する予定)
  10. アニメーション描画1(公開後にリンクを追加する予定)
  11. アニメーション描画2(公開後にリンクを追加する予定)

本シリーズのゴール

本シリーズでは,以下のポイントが実装できるようになることを目標としています.

  • 目的に応じたグラフを選択できるようになる
  • 誰にでも分かるようなグラフを作成できるようになる
  • 意図通りにアルゴリズムが動いているかのアニメーションを作成できるようになる

グラフの可視化を 「判断・説明・検証」 に使えるようになること.

本記事のゴール

本記事では,以下の内容を学ぶことができます.

  • 複数のグラフを1つの図に配置
  • plt.subplot() によるサブプロット
  • plt.subplots() によるサブプロット

1枚の図に複数のグラフを配置することが,本記事のゴールです.

サブプロットとは?

サブプロット(subplot) とは,
1つのFigure(キャンパス)の中に,複数のAxes(グラフ領域)を持つグラフを描画する仕組み
です.

イメージとしては

サブプロットのイメージ図
サブプロットのイメージ図

のような構成を作ることができます.
Axesの数を変更でき,複数のグラフを横一列にしたり,縦一列にしたりすることが可能です.

MatplotlibライブラリとNumPyライブラリの読み込み

Matplotlibを使うためには,まずライブラリの読み込みから始めます.
NumPyにより可視化したいデータを作成し,Matplotlibによりデータを可視化します.

import matplotlib.pyplot as plt
import numpy as np

numpyライブラリを np という名前として,扱えるようにしています.
matplotlibライブラリのpyplotモジュールを plt という名前として,扱えるようにしています.
以降では pltnp という名前を使っていきます.

plt.subplot() によるサブプロット

plt.subplot()による複数グラフの同時描画方法を説明します.

plt.subplot()のグラフを下図に示します.
のグラフ
plt.subplot()のグラフ

# 適当なXの値
x = np.linspace(0, 10, 111)

# 2行のグラフを作成する
# 1行目のグラフを描画
plt.subplot(2, 1, 1)
# サイン関数
plt.plot(x, np.sin(x))
# タイトルの作成
plt.title("Sin Curve")
# X軸ラベルの作成
plt.xlabel("x [rad]")
# グリッドの表示
plt.grid(True)

# 2行目のグラフを描画
plt.subplot(2, 1, 2)
# コサイン関数
plt.plot(x, np.cos(x))
# タイトルの作成
plt.title("Cos Curve")
# グリッドの表示
plt.grid(True)

# レイアウトをタイトにする
plt.tight_layout()
plt.savefig("test_article5_subplot.png")
# グラフの表示
plt.show()

plt.subplot() の引数を下表にまとめる.

引数 意味 備考
nrows 行数 -
ncols 列数 -
index 何番目のグラフ領域か 1始まり

表に記載していない plt.subplot() の引数に関しては,下記サイトを確認してください.
Matplotlib公式リファレンス

plt.subplot() の特徴は以下の通りです.

特徴

  • plt.subplot()を呼ぶたびに「描画したいグラフ領域」が切り替わる

メリット

  • 手軽に使える
  • 小規模な図に向いている

デメリット

  • どのグラフ領域で描画しているかがわかりにくい
  • 大規模な図では不向き

本記事では基本的な使い方に絞って解説しました.
より詳細な仕様や応用例については,参考文献もあわせてご覧ください.

plt.subplots() によるサブプロット

plt.subplots()による複数グラフの同時描画方法を説明します.

plt.subplots()の基本構文は下記の通りです.

fig, axes = plt.subplots(nrows, ncols)

fig:Figure(キャンパス)オブジェクト
axes:Axes(グラフ領域)オブジェクト(配列)

plt.subplots()のグラフを下図に示します.
のグラフ
plt.subplots()のグラフ

# 適当なXの値
x = np.linspace(0, 10, 111)

fig, axes = plt.subplots(2, 2, figsize=(10, 4))

# サイン関数の描画
axes[0, 0].plot(x, np.sin(x))
# タイトルの表示
axes[0, 0].set_title("Sin Curve")
# グリッドの表示
axes[0, 0].grid(True)

# コサイン関数の描画
axes[0, 1].plot(x, np.cos(x))
# タイトルの表示
axes[0, 1].set_title("Cos Curve")
# グリッドの表示
axes[0, 1].grid(True)

# タンジェント関数の描画
axes[1, 0].plot(x, np.tan(x))
# タイトルの表示
axes[1, 0].set_title("Tan Curve")
# グリッドの表示
axes[1, 0].grid(True)

# 一次直線の描画
axes[1, 1].plot(x, x)
# タイトルの表示
axes[1, 1].set_title("Linear")
# グリッドの表示
axes[1, 1].grid(True)

# グラフ同士の重なりを自動調整
plt.tight_layout()
# グラフの表示
plt.show()

Axes (軸オブジェクト) の考え方
axesグラフ1つ分のキャンパス と考えると理解しやすいです.

# グラフの描画
axes[i].plot()
# グラフにタイトルを設定
axes[i].set_title()
# グラフにグリッド線を追加
axes[i].grid()

plt.tight_layout() はグラフ同士の 重なりを自動調整 します.
サブプロットを使用すると

  • タイトル
  • 軸ラベル
  • 目盛り
    が重なってしまうことがあります.
    その際に重なりを自動調整する plt.tight_layout() を使用します.

plt.subplots() の特徴は以下の通りです.

特徴

  • plt.subplots()の戻り値のaxesの要素番号より,描画したいグラフ領域を指定できる

メリット

  • 大規模な図に向いている
  • どのグラフ領域で描画しているかがわかりやすい
  • オブジェクト指向の書き方

デメリット

  • 小規模な図では不向き

本記事では基本的な使い方に絞って解説しました.
より詳細な仕様や応用例については,参考文献もあわせてご覧ください.

plt.subplot()plt.subplots() の違い

plt.subplot()plt.subplots() の違いをまとめる.

項目 plt.subplot() plt.subplots()
書き方 手続き的 オブジェクト指向
拡張性 低い 高い
実務向け 低い 高い

終わりに

本記事では,Matplotlibでのサブプロットで複数グラフ描画に関する以下の内容を説明しました.

  • サブプロットで複数グラフを整理
  • plt.subplots() を基本に使うのがおすすめ
  • Axesオブジェクトを意識すると応用が広がる

次回予告

第6回では,以下のような「2次元の図形作成」に焦点を当てます.

  • 楕円
  • 長方形

図形作成 を実装できるようになります.

参考文献

本記事を作成するに当たって参考にしたサイトをまとめました.

Discussion