[matplotlib 3D] 29. NumPyのlogoをvoxelで表示

matplotlib 3D

コード

解説

n_voxels = np.zeros((4, 3, 4), dtype=bool)

bool値は0ならFalse、0以外ならTrueとなる。よって4×3×4のFalseの配列。

n_voxels[0, 0, :] = True

n_voxelsの[0, 0, :]をTrueにする。

facecolors = np.where(n_voxels, '#FFD65DC0', '#7A88CCC0')

n_voxelのTrueの部分を#FFD65DC0として、Falseの部分を#7A88CCC0とする。

filled = np.ones(n_voxels.shape)
filled_2 = explode(filled)

fillledはn_voxelsと同じかたちの要素がすべて1の配列。
filled_2はfilledを↓のexplode()したもの。

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

dataの形の2倍の大きさのsizeという配列を作り、sizeの各配列の大きさ1小さくした0の配列(data_e)をつくって、data_eに2こ飛ばしでdataの要素を入れていく。facecolors、edgecolorsも同様。

x, y, z = np.indices(np.array(filled_2.shape) + 1).astype(float) // 2

(filled_2.shape) + 1の形の、要素として各配列のindexをもつ配列の値を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

すきまをあける設定。

ax.voxels(x, y, z, filled_2, facecolors=fcolors_2, edgecolors=ecolors_2)

x,y,zがボクセルの左手前下の座標、filled_2で色をつける位置を指定している。[1]

隙間なしversion

+=0, +=1とした場合。

隙間大きいversion

+=0.2, +=0.8とした場合。

参考

  1. mpl_toolkits.mplot3d.axes3d.Axes3D — Matplotlib 3.0.0 documentation

コメント