python - 視点変更 - matplotlib mplot3Dなどの3D配列の等値面の3Dプロットを表示するにはどうすればよいですか?




seaborn 3d (2)

私は3次元配列があります。 私はこの配列のアイソサーフェスの素晴らしい3Dプロット(またはより厳密には、サンプルポイント間の補間によって定義された3Dスカラーフィールドの等値面を表示する)を(matplotlibで)表示したいと思います。

matplotlibのmplot3D部分は素晴らしい3Dプロットサポートを提供しますが、(私が見る限りでは)そのAPIにはスカラ値の3D配列を取り、等値面を表示するものはありません。 しかし、それはポリゴンのコレクションを表示することをサポートしているので、おそらく私はそのようなポリゴンを生成するマーチングキューブアルゴリズムを実装することができます。

私はそれを見つけられていない、またはこれをやるための簡単な方法がないと思っています。 あるいは、Python / numpy / scipyの世界から簡単に使用できる3D配列データを視覚化するための他のツールへのポインタを歓迎します。

https://code.i-harness.com


@DanHicksteinの回答を補完するために、 trisurfを使用して、マーチングキューブフェーズで得られたポリゴンを視覚化することもできます。

import numpy as np
from numpy import sin, cos, pi
from skimage import measure
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D


def fun(x, y, z):
    return cos(x) + cos(y) + cos(z)

x, y, z = pi*np.mgrid[-1:1:31j, -1:1:31j, -1:1:31j]
vol = fun(x, y, z)
verts, faces = measure.marching_cubes(vol, 0, spacing=(0.1, 0.1, 0.1))

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot_trisurf(verts[:, 0], verts[:,1], faces, verts[:, 2],
                cmap='Spectral', lw=1)
plt.show()

アップデート:2018年5月11日

@DrBwtsで述べたように、marching_cubesは4つの値を返します。 次のコードは動作します。

import numpy as np
from numpy import sin, cos, pi
from skimage import measure
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D


def fun(x, y, z):
    return cos(x) + cos(y) + cos(z)

x, y, z = pi*np.mgrid[-1:1:31j, -1:1:31j, -1:1:31j]
vol = fun(x, y, z)
verts, faces, _, _ = measure.marching_cubes(vol, 0, spacing=(0.1, 0.1, 0.1))

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot_trisurf(verts[:, 0], verts[:,1], faces, verts[:, 2],
                cmap='Spectral', lw=1)
plt.show()

あなたのプロットをmatplotlibに保存したい場合(私の意見ではmayaviよりも出版品質の画像を生成する方がずっと簡単です)、 skimageに実装されmarching_cubes関数を使用して、matplotlibに結果をプロットすることができます

mpl_toolkits.mplot3d.art3d.Poly3DCollection

上のリンクに示すように。 Matplotlibは等値面をレンダリングするのに非常に良い仕事をします。 実際の断層撮影データを作成した例を次に示します。





volume