サイトアイコン アマチュア無線局JS2IIU

【Matplotlib】MATLABスタイルとオブジェクト指向インターフェース

こんにちは、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に作用します。

特徴

基本的なコード例と解説

Python
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()  # グラフの表示

コード解説:

  1. import matplotlib.pyplot as plt: matplotlib.pyplotモジュールをpltという名前でインポートします。
  2. x = np.linspace(0, 10, 100): 0から10までの範囲を100個に分割したNumPy配列を生成し、x軸のデータとします。
  3. y = np.sin(x): xのsin値を計算し、y軸のデータとします。
  4. plt.plot(x, y): xとyのデータを元に折れ線グラフを描画します。
  5. plt.xlabel(), plt.ylabel(), plt.title(): それぞれ軸ラベルとグラフタイトルを設定します。
  6. plt.show(): 描画したグラフを表示します。

メリット

デメリット

オブジェクト指向インターフェース

オブジェクト指向インターフェースでは、FigureオブジェクトとAxesオブジェクトを明示的に操作します。Figureはグラフ全体のキャンバス、Axesは個々のグラフが描画される領域を表します。

特徴

基本的なコード例と解説

Python
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()

コード解説:

  1. fig, ax = plt.subplots(): FigureオブジェクトとAxesオブジェクトを生成します。figはグラフ全体のキャンバス、axはグラフが描画される領域です。
  2. ax.plot(x, y): ax(Axesオブジェクト)のplot()メソッドを使ってグラフを描画します。
  3. ax.set_xlabel(), ax.set_ylabel(), ax.set_title(): axのメソッドを使ってラベルとタイトルを設定します。

メリット

デメリット

オブジェクト指向インターフェースが真価を発揮する例

以下の例では、2つのグラフを1つのFigure内に配置し、それぞれ異なるスタイルとラベルを設定しています。これはMATLABスタイルでは煩雑になる操作であり、オブジェクト指向インターフェースの利点が明確に現れます。

Python
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()

コード解説:

  1. fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(8, 6)): plt.subplots()を使用して、2行1列の配置で2つのAxesオブジェクト (ax1ax2) を持つFigureオブジェクト (fig) を生成します。figsizeでFigure全体のサイズを指定しています。これがオブジェクト指向インターフェースの重要な部分です。MATLABスタイルではこのような配置はやや煩雑になります。
  2. ax1.plot(x, y1, 'b-', label='sin(x)', linewidth=2): 1つ目のAxes (ax1) にsin波を描画します。'b-'は青い実線を意味し、labelで凡例に表示するラベルを指定、linewidthで線の太さを指定しています。このように、プロットのスタイルを細かく制御できます。
  3. ax1.set_xlabel("X軸", fontsize=12)など: ax1のメソッドを使用して、軸ラベル、タイトル、フォントサイズ、太字、グリッド線、凡例などを設定しています。オブジェクト指向インターフェースでは、このように各要素を個別に制御できます。
  4. ax2.plot(x, y2, 'r--', label='cos(x)', marker='o', markersize=4): 2つ目のAxes (ax2) にcos波を描画します。'r--'は赤い破線を意味し、markerでデータ点を強調するマーカーを指定、markersizeでマーカーの大きさを指定しています。
  5. ax2.set_xlim(0, 5)ax2.set_ylim(-1.2, 1.2): ax2のX軸とY軸の表示範囲をそれぞれ0から5、-1.2から1.2に設定しています。
  6. plt.tight_layout(): グラフ間の間隔を自動的に調整し、ラベルなどが重ならないようにします。これは複数のグラフを配置する際に非常に便利です。
  7. plt.show(): グラフを表示します。

この例でオブジェクト指向インターフェースを選択する利点:

このように、複数のグラフを配置したり、グラフの要素を細かく制御したりする場合は、オブジェクト指向インターフェースが非常に有効です。この例を通して、オブジェクト指向インターフェースの利点をより深く理解していただけたかと思います。

まとめ

簡単なグラフを描画する場合はMATLABスタイル、複雑なグラフや細かいカスタマイズが必要な場合はオブジェクト指向インターフェースを選択するのが良いでしょう。特に、複数のグラフを配置したり、グラフの要素を細かく制御したりする場合は、オブジェクト指向インターフェースが圧倒的に有利です。そのため、これから書き方を覚えていこうとする方にはオブジェクト指向インターフェースでトライしてみることをお勧めしたいと思います。

参考WEBサイト

この記事が、Matplotlibのインターフェース選択の助けになれば幸いです。最後まで読んでいただきありがとうございました。73

モバイルバージョンを終了