🐋
Matplotlibで一次元、二次元データを可視化する(初心者向け)
今回はMatplotlibを使用して一次元、二次元データを可視化する方法をまとめます。
0. 初めに
Matplotlibには二つの書き方があります。
- pltで全て記述するPyplotインターフェース
- 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. 一次元データの描画
一次元データを描画します。
順番は以下のように考えます。
- xとyの準備
- figureの定義
- axesの定義
- axesにplot
- タイトル、軸ラベルを設定
- 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()
まとめ
本記事では一次元データと二次元データの可視化を行いました。
Discussion