Matplotlibで複数グラフを並べる方法|初心者でもわかるグラフ作成入門

※本サイトにはプロモーション・広告が含まれています。

(最終更新月: 2024年11月)

✔こんな方におすすめの記事です

「Matplotlibで複数のグラフを並べて表示したい」
「データを比較しやすいように、グラフを横に並べる方法を知りたい」
「Matplotlibのサブプロットの使い方がわからない」

✔当記事を通じて得られること

  • Matplotlibで複数グラフを並べる基本的な方法
  • サブプロットを使った効果的なグラフのレイアウト方法
  • 実践的なグラフ作成のテクニックとカスタマイズ方法

当記事では、Matplotlibの基本的な使い方から複雑なグラフレイアウトまで、実例を交えて詳しく解説していきます。
ぜひ最後までご覧ください。

筆者プロフィール

筆者プロフィールアイコン

【現職】プロダクトマネージャー

【副業】ブログ(月間20万PV)/YouTube/Web・アプリ制作

「プログラミング × ライティング × 営業」の経験を活かし、30後半からのIT系職へシフト。現在はプロダクトマネージャーとして、さまざまな関係者の間に入り奮闘してます。当サイトでは、実際に手を動かせるWebアプリの開発を通じて、プログラミングはもちろん、IT職に必要な情報を提供していきます。

【当ブログで紹介しているサイト】

当サイトチュートリアルで作成したデモ版日報アプリ

Django × Reactで開発したツール系Webアプリ

✔人に見せても恥ずかしくないコードを書こう

「リーダブルコード」は、わかりやすく良いコードの定義を教えてくれる本です。

  • 見るからにきれいなコードの書き方
  • コードの分割方法
  • 変数や関数の命名規則

エンジニアのスタンダートとすべき基準を一から解説しています。

何回も読むのに値する本なので、ぜひ手にとって読んでみてください。

Matplotlibで複数グラフを並べる基本

Matplotlibで複数のグラフを並べて表示する方法について説明していきます。
データ分析や可視化において、複数のグラフを比較することは非常に重要な作業です。

  • サブプロットとは
  • 基本的なグラフの配置方法
  • グラフサイズの調整方法
  • グラフ間のスペース調整

サブプロットとは

サブプロットは、1つの図(Figure)の中に複数のグラフを配置するための機能です。
Matplotlibでは、plt.subplot()やfigure.add_subplot()を使って実現できます。
以下が基本的な使用例になります。

import matplotlib.pyplot as plt
import numpy as np

# データの準備
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)

# 2つのグラフを横に並べる
plt.figure(figsize=(10, 4))
plt.subplot(1, 2, 1)  # 1行2列の1番目
plt.plot(x, y1)
plt.title('Sin Wave')

plt.subplot(1, 2, 2)  # 1行2列の2番目
plt.plot(x, y2)
plt.title('Cos Wave')

plt.tight_layout()
plt.show()

基本的なグラフの配置方法

グラフの配置は、subplot()の引数で指定できます。
行数、列数、配置位置の3つの数値で制御するのが基本です。
以下のように、様々な配置パターンを実現できます。

# 2行2列の例
plt.figure(figsize=(10, 8))

plt.subplot(2, 2, 1)
plt.plot([1, 2, 3], [1, 2, 3])
plt.title('グラフ1')

plt.subplot(2, 2, 2)
plt.plot([1, 2, 3], [3, 2, 1])
plt.title('グラフ2')

plt.subplot(2, 2, 3)
plt.plot([1, 2, 3], [2, 3, 1])
plt.title('グラフ3')

plt.subplot(2, 2, 4)
plt.plot([1, 2, 3], [1, 3, 2])
plt.title('グラフ4')

plt.tight_layout()
plt.show()

グラフサイズの調整方法

全体のグラフサイズは、figure()関数のfigsizeパラメータで調整できます。
単位はインチで指定し、横幅と縦幅を設定します。
以下は、グラフサイズを変更する例です。

# 大きめのグラフサイズで作成
plt.figure(figsize=(15, 6))
plt.subplot(1, 3, 1)
plt.plot([1, 2, 3], [1, 2, 3])
plt.title('大きいグラフ1')

plt.subplot(1, 3, 2)
plt.plot([1, 2, 3], [3, 2, 1])
plt.title('大きいグラフ2')

plt.subplot(1, 3, 3)
plt.plot([1, 2, 3], [2, 1, 3])
plt.title('大きいグラフ3')

plt.tight_layout()
plt.show()

効果的なグラフレイアウトの作成方法

複数のグラフを効果的に配置するためのテクニックを解説します。
見やすく、情報が伝わりやすいレイアウトを作成することが重要です。

  • グリッドレイアウトの活用
  • 非対称なレイアウトの作成
  • レイアウトのカスタマイズ方法

グリッドレイアウトの活用

GridSpecを使用すると、より柔軟なグリッドレイアウトが可能になります。
行や列のサイズを個別に調整できるのが特徴です。
以下のコードで、グリッドレイアウトを実現できます。

import matplotlib.gridspec as gridspec

fig = plt.figure(figsize=(12, 8))
gs = gridspec.GridSpec(2, 3)

ax1 = fig.add_subplot(gs[0, :2])
plt.plot([1, 2, 3], [1, 2, 3])
plt.title('広いグラフ')

ax2 = fig.add_subplot(gs[0, 2])
plt.plot([1, 2, 3], [3, 2, 1])
plt.title('細いグラフ')

ax3 = fig.add_subplot(gs[1, :])
plt.plot([1, 2, 3], [2, 3, 1])
plt.title('下段全体のグラフ')

plt.tight_layout()
plt.show()

非対称なレイアウトの作成

GridSpecを使うと、非対称なレイアウトも簡単に作成できます。
データの重要度に応じてグラフの大きさを変えることができます。
以下は、非対称レイアウトの例です。

fig = plt.figure(figsize=(12, 8))
gs = gridspec.GridSpec(2, 2)

ax1 = fig.add_subplot(gs[0, 0])
plt.plot([1, 2, 3], [1, 2, 3])
plt.title('左上グラフ')

ax2 = fig.add_subplot(gs[0, 1])
plt.plot([1, 2, 3], [3, 2, 1])
plt.title('右上グラフ')

ax3 = fig.add_subplot(gs[1, :])
plt.plot([1, 2, 3], [2, 3, 1])
plt.title('下段大きいグラフ')

plt.tight_layout()
plt.show()

レイアウトのカスタマイズ方法

グラフ間のスペースや余白を調整して、見やすいレイアウトを作成できます。
tight_layout()やsubplots_adjust()を使って細かい調整が可能です。
以下のコードで、レイアウトをカスタマイズできます。

fig, axes = plt.subplots(2, 2, figsize=(10, 8))
plt.subplots_adjust(wspace=0.3, hspace=0.3)

axes[0, 0].plot([1, 2, 3], [1, 2, 3])
axes[0, 0].set_title('グラフ1')

axes[0, 1].plot([1, 2, 3], [3, 2, 1])
axes[0, 1].set_title('グラフ2')

axes[1, 0].plot([1, 2, 3], [2, 3, 1])
axes[1, 0].set_title('グラフ3')

axes[1, 1].plot([1, 2, 3], [1, 3, 2])
axes[1, 1].set_title('グラフ4')

plt.show()

グラフの見た目の調整

複数のグラフを並べる際の見た目の調整方法について説明します。
見やすく、情報が正確に伝わるグラフを作成することが目標です。

  • タイトルとラベルの設定
  • 軸の範囲とグリッドの調整
  • 色とスタイルの設定

タイトルとラベルの設定

各グラフにタイトルや軸ラベルを適切に設定することで、情報がより伝わりやすくなります。
suptitle()を使用して全体のタイトルも設定できます。
以下は、タイトルとラベルを設定する例です。

fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5))

ax1.plot([1, 2, 3], [1, 2, 3])
ax1.set_title('データ1の推移')
ax1.set_xlabel('時間')
ax1.set_ylabel('値')

ax2.plot([1, 2, 3], [3, 2, 1])
ax2.set_title('データ2の推移')
ax2.set_xlabel('時間')
ax2.set_ylabel('値')

plt.suptitle('データ分析結果', fontsize=16)
plt.tight_layout()
plt.show()

軸の範囲とグリッドの調整

グラフの軸範囲やグリッドを適切に設定することで、データの比較が容易になります。
set_xlim()やset_ylim()で軸の範囲を設定できます。
以下のコードで、軸範囲とグリッドを調整できます。

fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5))

ax1.plot([1, 2, 3], [1, 2, 3])
ax1.set_xlim(0, 4)
ax1.set_ylim(0, 4)
ax1.grid(True)
ax1.set_title('グリッドあり')

ax2.plot([1, 2, 3], [3, 2, 1])
ax2.set_xlim(0, 4)
ax2.set_ylim(0, 4)
ax2.set_title('グリッドなし')

plt.tight_layout()
plt.show()

色とスタイルの設定

グラフの線の色やスタイルを変更することで、データの区別がつきやすくなります。
様々な色やマーカー、線のスタイルを組み合わせることができます。
以下は、色とスタイルを設定する例です。

x = np.linspace(0, 10, 100)
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5))

ax1.plot(x, np.sin(x), 'r-', label='sin')
ax1.plot(x, np.cos(x), 'b--', label='cos')
ax1.legend()
ax1.set_title('異なる線のスタイル')

ax2.scatter(x[::10], np.sin(x[::10]), c='red', marker='o', label='sin')
ax2.scatter(x[::10], np.cos(x[::10]), c='blue', marker='^', label='cos')
ax2.legend()
ax2.set_title('異なるマーカースタイル')

plt.tight_layout()
plt.show()

実践的なグラフ作成例

実際のデータ分析で使える実践的なグラフ作成例を紹介します。
複数のデータを効果的に表現する方法を学びましょう。

  • 時系列データの可視化
  • 散布図と折れ線グラフの組み合わせ
  • ヒートマップの作成方法

時系列データの可視化

時系列データを複数のグラフで表示する方法について説明します。
日付データの扱い方や、効果的な表示方法を紹介します。
以下は、時系列データを可視化する例です。

import pandas as pd

# サンプルデータの作成
dates = pd.date_range('2023-01-01', periods=100)
data1 = np.random.randn(100).cumsum()
data2 = np.random.randn(100).cumsum()

fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(12, 8))

ax1.plot(dates, data1, 'b-', label='データ1')
ax1.set_title('時系列データ1')
ax1.legend()
ax1.grid(True)

ax2.plot(dates, data2, 'r-', label='データ2')
ax2.set_title('時系列データ2')
ax2.legend()
ax2.grid(True)

plt.tight_layout()
plt.show()

散布図と折れ線グラフの組み合わせ

散布図と折れ線グラフを組み合わせることで、データの傾向と個々の値を同時に表示できます。
相関関係や外れ値の確認に適しています。
以下のコードで、散布図と折れ線グラフを組み合わせることができます。

x = np.linspace(0, 10, 50)
y = 2 * x + np.random.normal(0, 1, 50)

fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5))

ax1.scatter(x, y, c='blue', alpha=0.5)
ax1.plot(x, 2*x, 'r-', label='理論値')
ax1.set_title('散布図と理論線')
ax1.legend()

ax2.hist(y - 2*x, bins=20)
ax2.set_title('残差のヒストグラム')

plt.tight_layout()
plt.show()

ヒートマップの作成方法

ヒートマップを使って、データの相関関係や分布を視覚化できます。
複数の変数間の関係を一目で把握することができます。
以下は、ヒートマップを作成する例です。

import seaborn as sns

# サンプルデータの作成
data = np.random.rand(5, 5)
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5))

sns.heatmap(data, annot=True, cmap='YlOrRd', ax=ax1)
ax1.set_title('数値付きヒートマップ')

sns.heatmap(data, cmap='coolwarm', ax=ax2)
ax2.set_title('カラーグラデーションヒートマップ')

plt.tight_layout()
plt.show()

まとめ

当記事では、Matplotlibを使った複数グラフの配置方法について学習してきました。

  • サブプロットの基本的な使い方と効果的なレイアウト方法
  • グラフの見た目を調整するための様々なテクニック
  • 実践的なデータ可視化の手法とカスタマイズ方法

これらの知識を活かして、自分のデータ分析に合わせたグラフを作成してみましょう。

一度に複数のグラフを表示することで、データの比較や分析がより効果的になります。

ぜひ、実際のデータを使って様々なグラフレイアウトを試してみてください。

タイトルとURLをコピーしました