[matplotlib animation] 47. Voxelで作成したNumPyロゴの色変化アニメーション(カラー)

matplotlib 3D

はじめに

本記事では、matplotlibのVoxelグラフを使用して3次元のNumPyロゴを作成し、FuncAnimationを活用してロゴの色が時間とともに変化するアニメーションを実装する方法を詳しく解説します。

Voxelグラフとは

Voxel(ボクセル)は、3D空間におけるピクセルのようなもので、3次元データを立方体の集合として表現します。matplotlibのVoxelプロットを使うと、3D空間内の立方体を表示でき、複雑な3D構造を作成できます。

コード

解説

モジュールのインポート

3Dグラフの作成

3Dグラフとするために、ax を fig.gca(projection=’3d’)とします。

Numpyロゴの設定

データの生成

n_voxels = np.zeros((4, 3, 4), dtype=bool)では、bool値は0がFalse、0以外がTrueとなります。つまり、n_voxelsは4×3×4のFalse値で構成された配列になります。

n_voxels[0, 0, :] = Trueとすると、n_voxelsの[0, 0, :]の部分がTrueに変わります。このような一連のTrue化により、「N」の形状を表現しています。

facecolor, edgecolorの初期設定

n_voxelsのTrue部分とFalse部分の両方を’k’(黒)に設定します。facecolorはアニメーションで変化させるため、初期状態では両方とも黒にしています。また、edgecolorもすべてのボクセルで黒に設定しています。

データの拡張

filledはn_voxelsと同じ形状で、すべての要素が1の配列です。filled_2はfilledに下記のexplode()関数を適用したものになります。

この処理では、元データの要素数の2倍の大きさを持つsize配列を作成し、その配列よりも1小さいサイズの0で初期化された配列(data_e)を生成します。そして、data_eに元データの要素を2要素おきに配置していきます。

ボクセル間の隙間の設定

(filled_2.shape) + 1の形状で、各要素が配列のインデックスを持つ配列を作成します。そして、その値を2で割って切り捨てた要素を持つ新しい配列を生成します。各要素に+0.05などの微小値を加えることで、効果的に隙間を開けていきます。

アニメーションの設定

ここでは、カラーサイクルのリストから色をランダムに選択する手法を採用します。

カラーサイクルとは、複数のデータをプロットしたときに自動的に適用される色のセットで、plt.rcParams[‘axes.prop_cycle’].by_key()[‘color’]というコマンドでリスト形式で取得できます。

このリストからnp.random.choice(cycle)を使って一つの色を取り出し、col1とcol2の値を設定します。そして、np.where()関数を使ってTrueの位置にcol1、Falseの位置にcol2を適用します。

ax.voxels(x, y, z, filled_2, facecolors=fcolors_2, edgecolors=ecolors_2)でボクセルグラフを描画します。x、y、zはボクセルの左手前下の座標を指定し、filled_2で色を適用する位置を定義しています。

アニメーションの表示

アニメーション関数は25ステップで実行され、各ステップの間隔は200ミリ秒なので、全体で5秒のアニメーションとなります。Jupyter Notebook上では、HTML(ani.to_html5_video())と記述することでアニメーションを直接表示できます。

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

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

参考

mpl_toolkits.mplot3d.axes3d.Axes3D — Matplotlib 3.5.0 documentation
[matplotlib animation] 46. Voxelで作成したNumPyロゴの色変化アニメーション(グレースケール)
Matplotlibのvoxelを使ってNumPyロゴを3Dで表現し、グレースケールで色が変化するアニメーションを作成する方法を解説します。FuncAnimationを活用した3Dビジュアライゼーション技術について学べます。
matplotlibでcolor cycleのN番目の色を指定するいくつかの方法 - Qiita
実際の活用場面に即したタイトルにすると__「同じ図に複数データをプロットする際にcolor cycleから同じ色を指定する方法」とでもなりますが、少し一般性を持たせるためにどういう作業をするかに注目して「color cycleのN番目の色を...
https://docs.scipy.org/doc/numpy/reference/generated/numpy.random.choice.html

コメント