🐋

Matplotlibで一次元、二次元データを可視化する(初心者向け)

2024/04/02に公開

今回はMatplotlibを使用して一次元、二次元データを可視化する方法をまとめます。

0. 初めに

Matplotlibには二つの書き方があります。

  1. pltで全て記述するPyplotインターフェース
  2. figure,axes,axisに分けて記述するオブジェクト指向インターフェース

初めにこれらを比較してみましょう。

2つのインターフェースの比較

※出力は同じです

# 1. Pyplotインターフェース

import numpy as np
import matplotlib.pyplot as plt

# データを生成
x_1 = np.linspace(0, 1, 100)
y_1 = x_1
x_2 = np.linspace(0, 1, 100)
y_2 = x_2 ** 2
x_3 = np.linspace(0, 1, 100)
y_3 = x_3 ** 3
x_4 = np.linspace(0, 1, 100)
y_4 = x_4 ** 4

# 最初のサブプロット
plt.subplot(221)  # 2行2列の1番目
plt.plot(x_1, y_1)

# 2番目のサブプロット
plt.subplot(222)  # 2行2列の2番目
plt.plot(x_2, y_2)

# 3番目のサブプロット
plt.subplot(223)  # 2行2列の3番目
plt.plot(x_3, y_3)

# 4番目のサブプロット
plt.subplot(224)  # 2行2列の4番目
plt.plot(x_4, y_4)

# 図を表示
plt.show()
# 2. オブジェクト指向インターフェース

import numpy as np
import matplotlib.pyplot as plt

# データを生成
x_1 = np.linspace(0, 1, 100)
y_1 = x_1
x_2 = np.linspace(0, 1, 100)
y_2 = x_2 ** 2
x_3 = np.linspace(0, 1, 100)
y_3 = x_3 ** 3
x_4 = np.linspace(0, 1, 100)
y_4 = x_4 ** 4

# プロット
fig = plt.figure()

ax_1 = fig.add_subplot(221)
ax_2 = fig.add_subplot(222)
ax_3 = fig.add_subplot(223)
ax_4 = fig.add_subplot(224)

ax_1.plot(x_1, y_1)
ax_2.plot(x_2, y_2)
ax_3.plot(x_3, y_3)
ax_4.plot(x_4, y_4)

plt.show()

・出力

どちらを使用するかは好みで分かれると思いますが、Pyplotは図を作るたびにplotする必要があるため、まとめてplotできるオブジェクト指向インターフェースをお勧めします。

・オブジェクト指向インターフェースの考え方

1. 一次元データの描画

一次元データを描画します。
順番は以下のように考えます。

  1. xとyの準備
  2. figureの定義
  3. axesの定義
  4. axesにplot
  5. タイトル、軸ラベルを設定
  6. show

コードは以下のようになります。

# 1. xとyの準備
x = np.linspace(0, 1, 100)
y = x

# 2. figの定義
fig = plt.figure()
# 3. axesの定義
ax = fig.add_subplot(111) # 行,列,順番

# 4. axesにplot
ax.plot(x, y)

# 5. タイトル、軸ラベルを設定
ax.set_title('Data Plot')  
ax.set_xlabel('Index')
ax.set_ylabel('Value')

# 6. show
plt.show()


# # option: Customize ticks
# # Customize x-axis ticks
# ax.xaxis.set_major_locator(ticker.MultipleLocator(0.2))  # Set major tick interval to every 1
# ax.xaxis.set_minor_locator(ticker.MultipleLocator(0.1))  # Set minor tick interval to every 0.5

# # Customize y-axis ticks
# ax.yaxis.set_major_locator(ticker.MultipleLocator(0.1))  # Set major tick interval to every 10
# ax.yaxis.set_minor_locator(ticker.MultipleLocator(0.05))  # Set minor tick interval to every 5

# # Show grid for minor ticks
# ax.grid(which='major', linestyle=':', linewidth='0.5', color='gray')

・出力

2. 二次元データの描画

二次元データを描画します。
二次元データは、imshowでそのまま描画することができます。

import matplotlib.pyplot as plt
import numpy as np

# 2x2のサブプロットを作成
fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(10, 10))
# 2×2のaxオブジェクトを一次元配列に変換
axes = axes.flatten()

# それぞれのサブプロットにランダムデータを使用して画像を描画
for i in range(4):
        # axesから各axオブジェクトを取得
        ax = axes[i]
        # ランダムなデータを生成
        data = np.random.rand(10, 10)
        # サブプロットに画像を描画
        img = ax.imshow(data, cmap='viridis')
        # カラーバーの追加
        cbar = fig.colorbar(img, ax=ax)
        cbar.set_label('Value')
        # タイトルを追加
        ax.set_title(f'Image at {i}')
        # 軸の目盛りを非表示
        ax.axis('off')

# サブプロット間のスペースを調整
plt.tight_layout()
plt.show()

NxN plot
import matplotlib.pyplot as plt
import numpy as np

def visualize():
    n_row = 1
    n_col = 1
    fig, axes = plt.subplots(nrows=n_row, ncols=n_col, figsize=(n_row*3, n_col*3))

    if isinstance(axes, np.ndarray):
        one_image = False
        axes = axes.flatten()
        n_image = len(axes)
    else:
        one_image = True
        n_image = 1


    for i in range(n_image):
            if not one_image:
                ax = axes[i]
            else:
                ax = axes
            data = np.random.rand(10, 10)
            img = ax.imshow(data, cmap='viridis')
            cbar = fig.colorbar(img, ax=ax)
            cbar.set_label('Value')
            ax.set_title(f'Image at {i}')
            ax.axis('off')

    plt.tight_layout()
    plt.show()
visualize()

まとめ

本記事では一次元データと二次元データの可視化を行いました。

参考

(1) pythonのmatplotlibの使い方をまとめてみた

Discussion