2017-08-13 81 views
4

我在NumPy数组中有一个数据文件,我想查看3D图像。我共享的示例,其中,I可以查看大小(100,100)的2D图像,这是在中的Z的xy平面上的切片= 0在NumPy数组中绘制3D图像数据

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

我怎样才能查看形状数据T(100,100,100)的3D图像?

+1

你的问题似乎是类似于这个:http s://stackoverflow.com/q/7011428/3272066 – Giorgio

+2

@George我会说这个问题质量高得多,并且可能会从比链接问题更多的实质性答案中受益。 – Mast

+0

是的,因为Nachi提供了数据,所以可以很方便地看到各种方法的截图来显示数据,这些链接的问题没有 – Eric

回答

0

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

  1. 您更改问题:我不是在X,Y,Z的所有组合interessted,但只有那些,其中z = f(x,y)

  2. 你改变你的精确度有点小,说你不需要100个z的等级,但只有5个等级,那么你只需制作5个你已经拥有的情节。

在您要使用的第一种方法的情况下,则有几个子方法:

A.情节2暗淡表面f(x,y)=zT B.色彩运用它时使用任何TECHNIC以绘制复杂的功能,更多信息请参阅here

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

我用这个PROGRAMM:

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

+0

感谢您的建议。问题不在第四维绘制曲面。这是3D数据的可视化。每个点的数据应该用颜色表示。这也不应该是等值线图,因为等值线表示等级曲线的集合。 – Nachi

0

我已经得到了解决我的问题。如果我们有NumPy数据,那么我们可以将它们转换成TVTK ImageData,然后借助Mayabi的mlab形式进行可视化。代码和它的三维可视化有以下几种

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