[matplotlib 3D] 30. voxels_rgb

matplotlib 3D

voxels_rgb

コード

でできる図。

解説

def midpoints(x):
    sl = ()
    for i in range(x.ndim):
        x = (x[sl + np.index_exp[:-1]] + x[sl + np.index_exp[1:]]) / 2.0
        sl += np.index_exp[:]
    return x

中間点をもとめる関数。

r, g, b = np.indices((17, 17, 17)) / 16.0
rc = midpoints(r)

r, g, bはそれぞれ、(17, 17, 17)の形の0〜1を要素として持つ配列となる。
rc はrの中間に位置する配列をもつ。

sphere = (rc - 0.5)**2 + (gc - 0.5)**2 + (bc - 0.5)**2 < 0.5**2

球データの作成、この条件を満たす部分がTrueとなって、それ以外はFalseの配列ができる。

colors = np.zeros(sphere.shape + (3,))

でsphereの形に3,を追加して、colorsは、(16, 16, 16, 3)の形になる。

colors[..., 0] = rc
colors[..., 1] = gc
colors[..., 2] = bc

で各要素のrgbをcolorsに入れていく。

ax.voxels(r, g, b, sphere,
          facecolors=colors,
          edgecolors=np.clip(2*colors - 0.5, 0, 1),  # brighter
          linewidth=0.5)

edgecolorsで2*colors – 0.5の式の値で0〜1からはみ出すものは、大きい場合は1、小さい場合は0となる[1]。これもrgbで色を指定している。

edgecolors=np.clip(2*colors – 0.25, 0, 1)の場合

線がより明るくなった。

edgecolors=np.clip(colors-1, 0, 0)の場合

edgecolorsはすべて(0,0,0)となり黒くなる。

ax.set_aspect(‘equal’)とした場合

xyz軸の大きさを揃えて表示できる。

参考

  1. numpyで数値が指定範囲にいない場合に、指定範囲のmin/maxに置き換えたい : mwSoft blog
matplotlib 3Dpython
この記事をシェアする
sabopy.comをフォローする
サボテンパイソン

コメント