2017-08-13 58 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