Matplotlibでボクセル(Voxel)を描画する方法
3Dコンピュータグラフィックスにおいて、ボクセル(voxel)とは3次元空間の規則的なグリッド上の値を表すものです。2Dで使われるピクセルの3D版と考えると分かりやすいでしょう。ピクセルが「2D画像内の正方形」であり、2Dグリッド上の位置と単一の色の値を持つのに対し、ボクセルは「3Dモデル内の立方体」であり、3Dグリッド上の位置と単一の色の値を持ちます。
この記事では、Matplotlibを使ってボクセルを可視化する手順を、サンプルコード付きでわかりやすく解説します。
実装の手順
- 図のサイズを設定し、サブプロット間および周囲の余白(パディング)を調整します。
- 0〜1の範囲でランダムにデータポイントを作成します。
- 新しい図を作成するか、既存の図をアクティブにします。
- projection='3d' を指定して3D投影のAxes(現在の軸)を取得します。存在しない場合は新しく作成されます。
- voxels() メソッドを使って塗りつぶされたボクセルの集合をプロットします。
- show() メソッドで図を表示します。
サンプルコード
import numpy as np import matplotlib.pyplot as plt # 図のサイズを設定 plt.rcParams["figure.figsize"] = [7.50, 3.50] plt.rcParams["figure.autolayout"] = True # 0と1のランダムなデータポイントを作成 data = np.random.choice([0, 1], size=(5, 7, 9), p=[0.65, 0.35]) # 新しい図を作成 fig = plt.figure() # 3D投影のAxesを取得 ax = fig.add_subplot(projection='3d') # ボクセルをプロット ax.voxels(data, edgecolor="k", facecolors='green') # グラフを表示 plt.show()
コードのポイント
- np.random.choice([0, 1], size=(5, 7, 9), p=[0.65, 0.35]):5×7×9 の3次元配列を生成し、各要素が1(ボクセルを表示)になる確率を35%に設定しています。確率 p を変更すると、表示されるボクセルの密度を調整できます。
- edgecolor="k":ボクセルの輪郭線を黒に指定し、立体感が分かりやすくなります。
- facecolors='green':ボクセルの表面色を緑に設定しています。配列を渡せばボクセルごとに異なる色も指定可能です。
注意点
以前は fig.gca(projection='3d') で3D軸を取得する書き方が一般的でしたが、最近のMatplotlibでは非推奨となっており、fig.add_subplot(projection='3d') を使うことが推奨されています。上記のサンプルコードでは推奨される書き方を採用しています。
出力結果
上記のコードを実行すると、緑色のボクセルが立体的に配置された3Dプロットが表示されます。実行するたびにランダムなデータが生成されるため、表示されるボクセルのパターンは毎回変わります。
-
Matplotlibで任意のデータを使って4Dプロットを作成する方法
Matplotlibでは、x・y・z の3つの座標データに加え、c(色) を第4の次元として割り当てることで、いわゆる「4Dプロット」を実現できます。これは実際には3D散布図にカラーマップを組み合わせたものであり、点の位置が3次元情報を、色がもう1つの変数を表現します。以下の手順に従うことで、標準正規分布に従うランダムなデータポイントを使った4Dプロットを簡単に作成できます。手順figure() メソッドを使用して、新しい図を作成するか、既存の図をアクティブ化します。サブプロット構成の一部として、3D投影(projection=3d)を指定した Axes を追加します。NumPy を使って x
-
PythonのMatplotlibで中空(白抜き)の四角形マーカーを描画する方法
Matplotlibで中空(塗りつぶしなし)の四角形マーカーを描くには、マーカーの種類に ks を指定し、markerfacecolor=none、markersize=15、markeredgecolor=red を設定します。これにより、枠線だけの白抜きスタイルの四角形マーカーが描画されます。 各パラメータの意味 ks:k は黒色(black)、s は四角形(square)を表すマーカースタイルです。 markerfacecolor=none:マーカーの内部を塗りつぶさず、中空にします。 markersize(ms):マーカーのサイズを指定します(ここでは15)。 markeredgec