こんにちは、JS2IIUです。
matplotlibを使ったグラフを作ってみようとネットを検索すると、微妙に流派が異なるサンプルコードが見つかると思います。plt.plot()やax.plot()というものです。この流派の違いが今回の記事のテーマです。
Pythonのデータ可視化ライブラリであるMatplotlibは、グラフ描画において2つの主要なインターフェースを提供しています。それは、MATLABスタイルのインターフェースとオブジェクト指向インターフェースです。この記事では、それぞれの特徴、コード例、メリット・デメリットを解説し、どちらのインターフェースがどのような状況に適しているのかをお伝えします。今回もよろしくお願いします。
MATLABスタイルインターフェース
MATLABスタイルのインターフェースは、MATLABの描画機能に似たインターフェースを提供します。pltモジュール(import matplotlib.pyplot as plt)を通じてアクセスし、状態を保持する仕組みを持っています。つまり、plt.plot()やplt.title()などのコマンドは、内部的に維持されているfigureとaxesに作用します。
特徴
- シンプルで直感的: 簡単なグラフを素早く描画するのに適しています。
- 状態の保持: 最後に実行されたコマンドが現在のfigureとaxesに影響します。
- 暗黙的な操作: figureとaxesの生成や管理が暗黙的に行われます。
基本的なコード例と解説
import matplotlib.pyplot as plt
import numpy as np
# データ生成
x = np.linspace(0, 10, 100)
y = np.sin(x)
# グラフ描画
plt.plot(x, y) # 折れ線グラフの描画
plt.xlabel("X") # X軸ラベルの設定
plt.ylabel("Y") # Y軸ラベルの設定
plt.title("Sin wave") # グラフタイトルの設定
plt.show() # グラフの表示
コード解説:
import matplotlib.pyplot as plt:matplotlib.pyplotモジュールをpltという名前でインポートします。x = np.linspace(0, 10, 100): 0から10までの範囲を100個に分割したNumPy配列を生成し、x軸のデータとします。y = np.sin(x): xのsin値を計算し、y軸のデータとします。plt.plot(x, y): xとyのデータを元に折れ線グラフを描画します。plt.xlabel(),plt.ylabel(),plt.title(): それぞれ軸ラベルとグラフタイトルを設定します。plt.show(): 描画したグラフを表示します。
メリット
- コードが短く、記述が簡単。
- 簡単なグラフ作成に最適。
デメリット
- 複雑なグラフや複数のグラフを同時に扱うのが難しい。
- 細かい制御がしづらい。
オブジェクト指向インターフェース
オブジェクト指向インターフェースでは、FigureオブジェクトとAxesオブジェクトを明示的に操作します。Figureはグラフ全体のキャンバス、Axesは個々のグラフが描画される領域を表します。
特徴
- 明示的な操作: FigureとAxesを生成し、それぞれのメソッドを呼び出してグラフを操作します。
- 高い柔軟性: 複雑なグラフや複数のグラフを自由に配置できます。
- 細かい制御: グラフのあらゆる要素を細かくカスタマイズできます。
基本的なコード例と解説
import matplotlib.pyplot as plt
import numpy as np
# データ生成
x = np.linspace(0, 10, 100)
y = np.sin(x)
# FigureとAxesの生成
fig, ax = plt.subplots() # fig: Figureオブジェクト, ax: Axesオブジェクト
# グラフ描画
ax.plot(x, y) # Axesオブジェクトのメソッドを使って描画
ax.set_xlabel("X") # Axesオブジェクトのメソッドを使ってラベルを設定
ax.set_ylabel("Y")
ax.set_title("Sin wave")
plt.show()
コード解説:
fig, ax = plt.subplots(): FigureオブジェクトとAxesオブジェクトを生成します。figはグラフ全体のキャンバス、axはグラフが描画される領域です。ax.plot(x, y):ax(Axesオブジェクト)のplot()メソッドを使ってグラフを描画します。ax.set_xlabel(),ax.set_ylabel(),ax.set_title():axのメソッドを使ってラベルとタイトルを設定します。
メリット
- 複雑なグラフや複数のグラフを自由に作成できる。
- グラフのあらゆる要素を細かく制御できる。
- コードの再利用性が高い。
デメリット
- コードがやや長くなる。
- 初心者には少し難しく感じる場合がある。
オブジェクト指向インターフェースが真価を発揮する例
以下の例では、2つのグラフを1つのFigure内に配置し、それぞれ異なるスタイルとラベルを設定しています。これはMATLABスタイルでは煩雑になる操作であり、オブジェクト指向インターフェースの利点が明確に現れます。
import matplotlib.pyplot as plt
import numpy as np
# データ生成
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)
# FigureとAxesの生成(2つのAxesを配置)
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(8, 6)) # 2行1列の配置、figsizeで全体のサイズを指定
# 1つ目のグラフ(sin波)
ax1.plot(x, y1, 'b-', label='sin(x)', linewidth=2) # 青い実線、ラベル、線幅を指定
ax1.set_xlabel("X", fontsize=12) # X軸ラベル、フォントサイズを指定
ax1.set_ylabel("Y", fontsize=12) # Y軸ラベル、フォントサイズを指定
ax1.set_title("Sin wave", fontsize=14, fontweight='bold') # タイトル、フォントサイズ、太字を指定
ax1.grid(True, linestyle='--', alpha=0.5) # グリッド線、スタイル、透明度を指定
ax1.legend(loc='upper right') # 凡例の表示位置を指定
# 2つ目のグラフ(cos波)
ax2.plot(x, y2, 'r--', label='cos(x)', marker='o', markersize=4) # 赤い破線、ラベル、マーカーを指定
ax2.set_xlabel("X", fontsize=12)
ax2.set_ylabel("Y", fontsize=12)
ax2.set_title("Cos wave", fontsize=14, fontweight='bold')
ax2.set_xlim(0, 5) # X軸の範囲を指定
ax2.set_ylim(-1.2, 1.2) # Y軸の範囲を指定
ax2.legend()
# レイアウト調整
plt.tight_layout() # グラフ間の間隔を自動調整
# グラフの表示
plt.show()
コード解説:
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(8, 6)):plt.subplots()を使用して、2行1列の配置で2つのAxesオブジェクト (ax1とax2) を持つFigureオブジェクト (fig) を生成します。figsizeでFigure全体のサイズを指定しています。これがオブジェクト指向インターフェースの重要な部分です。MATLABスタイルではこのような配置はやや煩雑になります。ax1.plot(x, y1, 'b-', label='sin(x)', linewidth=2): 1つ目のAxes (ax1) にsin波を描画します。'b-'は青い実線を意味し、labelで凡例に表示するラベルを指定、linewidthで線の太さを指定しています。このように、プロットのスタイルを細かく制御できます。ax1.set_xlabel("X軸", fontsize=12)など:ax1のメソッドを使用して、軸ラベル、タイトル、フォントサイズ、太字、グリッド線、凡例などを設定しています。オブジェクト指向インターフェースでは、このように各要素を個別に制御できます。ax2.plot(x, y2, 'r--', label='cos(x)', marker='o', markersize=4): 2つ目のAxes (ax2) にcos波を描画します。'r--'は赤い破線を意味し、markerでデータ点を強調するマーカーを指定、markersizeでマーカーの大きさを指定しています。ax2.set_xlim(0, 5)、ax2.set_ylim(-1.2, 1.2): ax2のX軸とY軸の表示範囲をそれぞれ0から5、-1.2から1.2に設定しています。plt.tight_layout(): グラフ間の間隔を自動的に調整し、ラベルなどが重ならないようにします。これは複数のグラフを配置する際に非常に便利です。plt.show(): グラフを表示します。
この例でオブジェクト指向インターフェースを選択する利点:
- 明確な配置:
plt.subplots(2, 1)で2つのグラフを縦に並べて配置することを明示的に指定できます。 - 個別の制御: 各Axes (
ax1とax2) に対して個別にスタイル、ラベル、タイトル、軸範囲などを設定できます。これはMATLABスタイルでは難しく、コードも煩雑になります。 - 高い柔軟性: グラフの配置、サイズ、スタイルなどを細かくカスタマイズできるため、複雑な可視化にも対応できます。
このように、複数のグラフを配置したり、グラフの要素を細かく制御したりする場合は、オブジェクト指向インターフェースが非常に有効です。この例を通して、オブジェクト指向インターフェースの利点をより深く理解していただけたかと思います。
まとめ
簡単なグラフを描画する場合はMATLABスタイル、複雑なグラフや細かいカスタマイズが必要な場合はオブジェクト指向インターフェースを選択するのが良いでしょう。特に、複数のグラフを配置したり、グラフの要素を細かく制御したりする場合は、オブジェクト指向インターフェースが圧倒的に有利です。そのため、これから書き方を覚えていこうとする方にはオブジェクト指向インターフェースでトライしてみることをお勧めしたいと思います。
参考WEBサイト
- PythonのMatplotlibでグラフを描く – 基本と2つのスタイルでざっくり理解!
- Matplotlibとオブジェクト指向について – AI実装検定
- FigureやAxesを完全理解!Matplotlibでグラフを描こう – DS Media by Tech Teacher
- 早く知っておきたかったmatplotlibの基礎知識、あるいは見た目の調整が捗るArtistの話 – Qiita
この記事が、Matplotlibのインターフェース選択の助けになれば幸いです。最後まで読んでいただきありがとうございました。73


コメント