Skip to content

Matplotlib における同一図に複数のプロット

Updated on

データ科学の世界において説得力のあるデータ可視化を作成することは重要なスキルです。そのために欠かせないツールの1つが、データ可視化専用の Python ライブラリである Matplotlib です。この包括的なガイドでは、Matplotlib において同一図に複数のプロットを作成する方法について解説します。この機能を使うことで、複数のデータ傾向を統一されたキャンバス上で比較でき、単一プロットよりもデータ可視化の明確性と可読性が向上します。

Matplotlib における複数プロットの基本

より複雑な可視化に進む前に、Matplotlib を使った同一図上に複数の線をプロットする基本的な方法を確認しましょう。

Matplotlib の pyplot モジュールは、グラフやプロットの作成を簡単にします。MATLAB と非常に似た構文を持っているため、そのシステムに慣れた人にとっては有利です。まずは、異なるデータセットを使用して 2 つの線を持つ図を作成する方法を示す簡単な例を紹介します:

import matplotlib.pyplot as plt
 
# サンプルデータ
x = [1, 2, 3, 4, 5]
y1 = [1, 2, 3, 4, 5]
y2 = [5, 4, 3, 2, 1]
 
# プロットを作成
plt.plot(x, y1, 'b-', label='昇順')
plt.plot(x, y2, 'r-', label='降順')
 
# 凡例を追加
plt.legend(loc='best')
 
# 図を表示
plt.show()

この例では、plt.plot(x, y1, 'b-', label='昇順')plt.plot(x, y2, 'r-', label='降順') が y1 と y2 のデータセットを x に対してプロットします。'b-' および 'r-' 引数はラインの色と種類を定義します(それぞれブルーとレッド)、'昇順' および '降順' は凡例用のラベルです。plt.legend(loc='best') 関数呼び出しは、プロットされたラインと最小限重複する場所に凡例を配置します。

プロットが増えて、複雑性が増す: Matplotlib のオブジェクト指向 API

前述のテクニックは、単純なプロットに対しては簡単で効果的ですが、より複雑な可視化に取り組む際には限界が生じるかもしれません。ここで、Matplotlib のオブジェクト指向 API が登場します。Figure と Axes オブジェクトを作成することで、プロットの要素に細かい制御が加えられます。前述の結果を同じように達成するために、以下のようにこの API を使うことができます:

# Figure と Axes オブジェクトを作成
fig, ax = plt.subplots()
 
# データを Axes にプロットする
ax.plot(x, y1, 'b-', label='昇順')
ax.plot(x, y2, 'r-', label='降順')
 
# 凡例を追加
ax.legend(loc='best')
 
# 図を表示
plt.show()

コードを解読する:オブジェクト指向アプローチの理解

あなたは、より簡単なpyplotモジュールでも仕事ができるのに、なぜより冗長なオブジェクト指向APIを使用するのか、と思うかもしれません。しかし、可視化がより洗練されるにつれて、答えは明らかになります。FigureとAxesオブジェクトを使用すると、プロットに対するより高度な制御が可能になります。それによって、よりシンプルなpyplotインターフェイスでは容易に提供されないカスタマイズが可能になります。

FigureとAxesオブジェクトをプロットのコンテナーと考えてください。Figureオブジェクトは全体のウィンドウまたはページであり、すべてが描画されます。これには複数のAxesオブジェクトが含まれることがあります。そして、それぞれのAxesオブジェクトは、その各要素(線、凡例、ラベルなど)を持った独自のプロットです。

この理解を持っていると、オブジェクト指向アプローチがより複雑な複数プロットの可視化のために堅実な基盤を提供することが分かります。それについては、以下のセクションで探索していきます。

複数のサブプロット: 複数のAxesを含むFigure

1つのAxesオブジェクトに複数の線をプロットすることは理解できましたが、同じFigure内で完全に独立したサブプロットを比較する必要がある場合はどうでしょうか?Matplotlibの subplots() 関数を使用すると、効率的に実現することができます。 subplots() 関数は、新しいFigureと複数のAxesオブジェクトを一度に作成し、使用するために返します。同じFigure内に2行2列の4つのサブプロットを生成する方法を見てみましょう。

# 2x2のグリッドのAxesを持つ新しいFigureを作成
fig, axs = plt.subplots(2, 2)
 
# サンプルデータを定義
x = [1, 2, 3, 4, 5]
y = [[1, 2, 3, 4, 5], [5, 4, 3, 2, 1], [2, 3, 4, 5, 6], [6, 5, 4, 3, 2]]
 
# 各Axesにデータをプロット
for i, ax in enumerate(axs.flatten()):
    ax.plot(x, y[i])
 
# 図を表示
plt.show()

この場合、plt.subplots(2, 2) は2x2のグリッド状のAxesを作成し、 axs.flatten() はそれらのAxesを簡単なforループで反復処理するために使用されます。

複数のY軸: 1つのY軸では十分ではない場合

同じグラフに異なるスケールや単位を持つ異なるデータセットをプロットする必要がある場合があります。同じプロットで2つの異なるY軸を使用するのは、そのようなシナリオに最適な解決策です。Matplotlibのオブジェクト指向APIを使用すると、簡単に実行できます。

# 新しいFigureとAxesを作成
fig, ax1 = plt.subplots()
 
# x軸を共有する2番目のAxesを作成
ax2 = ax1.twinx()
 
# 各Axesにデータをプロット
ax1.plot(x, y1, 'b-', label='データセット1')
ax2.plot(x, y2, 'r-', label='データセット2')
 
# Y軸のラベルを設定
ax1.set_ylabel('データセット1', color='b')
ax2.set_ylabel('データセット2', color='r')
 
# 図を表示する
plt.show()

この場合、 ax1.twinx() は、ax1とx軸を共有する新しいAxesを作成し、独立したY軸を持たせます。

Matplotlibの代わりにPyGWalkerを使用してデータを視覚化する

pandas dataframeを可視化するためにMatplotlibを使用することは、前述の通りです。しかし、Pythonのオープンソースライブラリである PyGWalker (opens in a new tab) は、データの可視化を簡単に行える代替手段となります。

PyGWalker for Data visualization (opens in a new tab) Pythonコーディングで複雑な処理を完了する必要はもうありません。データをインポートして、変数をドラッグアンドドロップするだけで、あらゆる種類のデータ可視化を作成できます! 操作のクイックデモ動画はこちらです:


以下は、Jupyter NotebookでPyGWalkerを使用する方法です:

pip install pygwalker
import pygwalker as pyg
gwalker = pyg.walk(df)

代替方法として、Kaggle Notebook / Google Colabで試すことができます:

PyGWalkerをKaggle Notebookで実行 (opens in a new tab)PyGWalkerをGoogle Colabで実行 (opens in a new tab)GitHubでPyGWalkerに⭐️を付ける (opens in a new tab)
PyGWalkerをKaggle Notebookで実行 (opens in a new tab)PyGWalkerをGoogle Colabで実行 (opens in a new tab)PyGWalkerをGitHubで実行 (opens in a new tab)

PyGWalkerは、オープンソースコミュニティのサポートを受けて構築されています。 PyGWalker GitHub (opens in a new tab)をチェックして、スターをつけましょう!

結論

Matplotlibで同じ図に複数のプロットを作成する技術を習得することは、データ可視化スキルを新たなレベルにまで高めます。基本的な概念を理解し、より複雑な領域に進むことにより、Matplotlibを効果的に使用してデータを活用することができます。

FAQ

  1. Matplotlibで同じ図に複数のプロットを作成する利点は何ですか?

同じ図に複数のプロットを作成することで、データの可視化が大幅に改善されます。この機能により、単一のキャンバス上で複数のデータ動向を分析できるため、より簡単なデータ比較が可能になります。また、データ表現の明瞭さと可読性が向上します。

  1. Matplotlibのオブジェクト指向APIを使用するタイミングはいつですか?

pyplotモジュールは簡単で単純なプロットに適していますが、Matplotlibのオブジェクト指向APIは、複雑な可視化に適しています。FiguresオブジェクトとAxesオブジェクトに直接操作することにより、プロットの要素に細かく制御できるため、より高度なカスタマイズが必要な場合に非常に有用です。

  1. 単一のプロットで複数のy軸を使用する目的は何ですか?

異なるスケールまたは単位を持つ異なるデータセットを同じグラフにプロットする場合、複数のy軸が特に役立ちます。各データセットをそのy軸に割り当てることで、これらの異なるスケールまたは単位を効果的に表現でき、データを歪めたり誤った表現をすることなく、これらのスケールまたは単位を表現できます。 このマークダウンファイルには、日本語への翻訳が必要です。しかし、提供されたテキストには翻訳が必要な箇所が見当たりません。}}/>は文脈によって役割が異なるため、より詳細な情報が必要です。