[matplotlib animation] 46. Voxelで作成したNumPyロゴの色変化アニメーション(グレースケール)

matplotlib 3D

はじめに

この記事では、Matplotlibのvoxel機能を使用してNumPyロゴを3D表現し、グレースケールで色が徐々に変化するアニメーションを作成する方法を詳しく解説します。

コード

解説

モジュールのインポート

3Dグラフの作成

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

Numpyロゴの設定

データの生成

n_voxels = np.zeros((4, 3, 4), dtype=bool)は、bool値の配列を作成します。numpy配列では0がFalse、0以外の値がTrueとなるため、この命令で4×3×4のすべてFalseの配列が生成されます。

n_voxels[0, 0, :] = Trueという操作で、n_voxelsの[0, 0, :]の部分がTrueに変更されます。このような一連のTrue設定により、NumPyロゴの「N」の形状が作られています。

facecolor, edgecolorの初期設定

n_voxelsの配列でTrueの部分もFalseの部分も初期値として’k’(黒)に設定します。facecolorはアニメーションの過程で変化させるため、最初はすべて黒にしています。また、edgecolorもすべてのボクセルで黒に統一しました。

データの拡張

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

まず、dataの要素サイズの2倍の大きさを持つsize配列を作成します。次に、sizeの各次元から1を引いたサイズの0埋め配列(data_e)を生成し、その後data_eに2要素ごとにdataの値を配置していきます。

ボクセル間の隙間の設定

(filled_2.shape) + 1の形状の配列を作成し、各要素には配列のインデックスを格納します。その後、この値を2で割って切り捨てた要素を持つ新しい配列を生成します。さらに、各要素に+0.05などの値を加えることで、適切に隙間を作り出していきます。

アニメーションの設定

col_1とcol_2は0〜1の範囲のランダムな値で、np.where()関数を使ってTrueとFalseの位置にそれぞれ設定します。ボクセルグラフはax.voxels(x, y, z, filled_2, facecolors=fcolors_2, edgecolors=ecolors_2)で表示します。このとき、x、y、zはボクセルの左手前下の座標を表し、filled_2パラメータで色を適用する位置を指定しています。

アニメーションの表示

アニメーション関数を25ステップ実行し、200ms間隔で図を順次更新することで、合計5秒のアニメーションを作成します。jupyter notebook上では、HTML(ani.to_html5_video())を実行するだけでアニメーションを表示できます。

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

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

参考

mpl_toolkits.mplot3d.axes3d.Axes3D — Matplotlib 3.5.0 documentation

コメント