绘制3D图像形成NumPy阵列中的数据

时间:2017-08-13 18:28:24

标签: python arrays image numpy 3d

我在NumPy数组中有一个数据文件,我想查看3D图像。我正在分享一个例子,我可以在其中查看大小为(100,100)的2D图像,这是xy平面中z = 0处的切片。

import numpy as np
from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
X, Y, Z = np.mgrid[-10:10:100j, -10:10:100j, -10:10:100j]
T = np.sin(X*Y*Z)/(X*Y*Z)
T=T[:,:,0]
im = plt.imshow(T, cmap='hot')
plt.colorbar(im, orientation='vertical')
plt.show()

Slice at z = 0

如何查看形状(100,100,100)的数据T的3D图像?

2 个答案:

答案 0 :(得分:0)

我认为主要的问题是,每个点确实有4个信息,所以实际上你是在一个4维物体中。绘制这一点总是很困难(甚至可能是不可能的)。我建议采用以下解决方案之一:

  1. 您将问题更改为:我没有在x,y,z的所有组合中进行插入,而只是在z = f(x,y)

  2. 的所有组合中。
  3. 你改变了一点的准确性,说你不需要100级z,但只有5级,那么你只需要制作你已有的5个图。

  4. 如果你想使用第一种方法,那么有几种子方法:

    一个。绘制2-dim曲面f(x,y)=z并使用T对其进行着色 B.使用用于绘制复杂函数的任何技术,有关详细信息,请参阅here

    方法1.A给出的图(我认为这是最好的解决方案),z=x^2+y^2得出: enter image description here

    我用过这个程序:

    import numpy as np
    from matplotlib import pyplot as plt
    from mpl_toolkits.mplot3d import Axes3D
    import matplotlib as mpl
    X, Y = np.mgrid[-10:10:100j, -10:10:100j]
    Z = (X**2+Y**2)/10 #definition of f
    T = np.sin(X*Y*Z)
    norm = mpl.colors.Normalize(vmin=np.amin(T), vmax=np.amax(T))
    T = mpl.cm.hot(T) #change T to colors
    fig = plt.figure()
    ax = fig.gca(projection='3d')
    surf = ax.plot_surface(X, Y, Z, facecolors=T, linewidth=0,
           cstride = 1, rstride = 1)
    plt.show()
    

    第二种方法提供了类似的内容:

    enter image description here

    使用代码:

    norm = mpl.colors.Normalize(vmin=-1, vmax=1)
    X, Y= np.mgrid[-10:10:101j, -10:10:101j]
    fig = plt.figure()
    ax = fig.gca(projection='3d')
    for i in np.linspace(-1,1,5):
        Z = np.zeros(X.shape)+i
        T = np.sin(X*Y*Z)
        T = mpl.cm.hot(T)
        ax.plot_surface(X, Y, Z, facecolors=T, linewidth=0, alpha = 0.5, cstride 
            = 10, rstride = 10)
    
    plt.show()
    

    注意:我将函数更改为T = sin(X*Y*Z),因为除以X*Y*Z会使函数行为变坏,因为您将两个数字除以非常接近0。

答案 1 :(得分:0)

我有一个问题的解决方案。如果我们有NumPy数据,那么我们可以将它们转换为TVTK ImageData,然后在mlab形式Mayavi的帮助下实现可视化。代码及其3D可视化如下

from tvtk.api import tvtk
import numpy as np
from mayavi import mlab
X, Y, Z = np.mgrid[-10:10:100j, -10:10:100j, -10:10:100j]
data = np.sin(X*Y*Z)/(X*Y*Z)
i = tvtk.ImageData(spacing=(1, 1, 1), origin=(0, 0, 0))
i.point_data.scalars = data.ravel()
i.point_data.scalars.name = 'scalars'
i.dimensions = data.shape
mlab.pipeline.surface(i)
mlab.colorbar(orientation='vertical')
mlab.show()

enter image description here

对于另一个随机生成的数据

from numpy import random
data = random.random((20, 20, 20))

可视化将是

enter image description here