[matplotlib 3D] 30. voxelグラフでRGB色空間を可視化

matplotlib 3D

はじめに

matplotlibのvoxelグラフで各ボクセルの色を変化させる例として、グラフで各座標位置の値に対応するrgbを当てはめた球を表示する。

コード

コードをダウンロード(.ipynbファイル)

解説

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となる。これもrgbで色を指定している。

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

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

fig = plt.figure(figsize=(6,6))とした場合

xyz軸の大きさが揃ったグラフとなる。

参考

3D voxel / volumetric plot with rgb colors — Matplotlib 3.1.2 documentation
numpyで数値が指定範囲にいない場合に、指定範囲のmin/maxに置き換えたい
とある数値について、0.0〜1.0の間にいて欲しいのに-0.1とか1.1みたいな値が混ざっていた場合。

コメント

  1. […] 関数midpoints(x)は、[matplotlib 3D] 30. voxels_rgbで定義したものとおなじである。 […]