はじめに
この実験では、Matplotlib のAxes3D.voxels関数を使って NumPy のロゴの 3D ボクセルプロットを作成する方法を示します。
VM のヒント
VM の起動が完了したら、左上隅をクリックしてノートブックタブに切り替え、Jupyter Notebook を使って練習しましょう。
時々、Jupyter Notebook が読み込み終わるまで数秒待つ必要があります。Jupyter Notebook の制限により、操作の検証は自動化できません。
学習中に問題がある場合は、Labby にお問い合わせください。セッション後にフィードバックを提供してください。すぐに問題を解決いたします。
ライブラリのインポート
まず、必要なライブラリである Matplotlib と NumPy をインポートする必要があります。
import matplotlib.pyplot as plt
import numpy as np
拡大関数の定義
次に、NumPy のロゴのボクセル画像を拡大するために使用されるexplodeと呼ばれる関数を定義します。この関数は、NumPy 配列を入力として受け取り、入力配列の 2 倍のサイズの新しい NumPy 配列を返します。
def explode(data):
size = np.array(data.shape)*2
data_e = np.zeros(size - 1, dtype=data.dtype)
data_e[::2, ::2, ::2] = data
return data_e
NumPy のロゴを作成する
ここでは、n_voxelsと呼ばれる 3 次元 NumPy 配列を使って NumPy のロゴを作成し始めます。配列内の特定の要素をTrueに設定して、ロゴの形状を表します。また、ボクセルに色を付けるために使われるfacecolorsとedgecolorsと呼ばれる他の 2 つの NumPy 配列も定義します。
n_voxels = np.zeros((4, 3, 4), dtype=bool)
n_voxels[0, 0, :] = True
n_voxels[-1, 0, :] = True
n_voxels[1, 0, 2] = True
n_voxels[2, 0, 1] = True
facecolors = np.where(n_voxels, '#FFD65DC0', '#7A88CCC0')
edgecolors = np.where(n_voxels, '#BFAB6E', '#7D84A6')
ボクセル画像を拡大する
ここでは、先ほど定義したexplode関数を使って、ボクセル画像を拡大し、各ボクセルの間に隙間を残します。
filled = np.ones(n_voxels.shape)
filled_2 = explode(filled)
fcolors_2 = explode(facecolors)
ecolors_2 = explode(edgecolors)
隙間を狭める
NumPy のindices関数を使って各ボクセルの座標を変更することで、各ボクセル間の隙間を狭めます。
x, y, z = np.indices(np.array(filled_2.shape) + 1).astype(float) // 2
x[0::2, :, :] += 0.05
y[:, 0::2, :] += 0.05
z[:, :, 0::2] += 0.05
x[1::2, :, :] += 0.95
y[:, 1::2, :] += 0.95
z[:, :, 1::2] += 0.95
ボクセルプロットを作成する
最後に、Matplotlib のAxes3Dクラスのvoxels関数を使って 3D ボクセルプロットを作成します。
ax = plt.figure().add_subplot(projection='3d')
ax.voxels(x, y, z, filled_2, facecolors=fcolors_2, edgecolors=ecolors_2)
ax.set_aspect('equal')
plt.show()
まとめ
この実験では、Matplotlib を使って NumPy のロゴの 3D ボクセルプロットを作成する方法を示しました。NumPy を使ってロゴを作成し、Axes3D.voxels関数を使ってプロットを作成しました。また、explodeと呼ばれる関数を使って、ロゴのボクセル画像を拡大しました。