Mlab了解
Mlab是Mayavi提供的面向腳本的api,他可以實現快速的三維可視化,Mayavi可以通過Mlab的繪圖函數對Numpy數組建立可視化。
過程為:
1.建立數據源 2.使用Filter(可選)對數據進行加工 3.添加可視化模塊,我們可以通過修改可視化模塊的屬性,來修改可視化場景
mgrid和ogrid區別
一:基於Numpy數組的繪圖函數
(一)3D繪圖函數--Point3d(點圖像0維)
這里我們可以看到Point3D參數的描述,是對vtk對象的整體描述,因為Mayavi是對VTK的整體封裝,因此Mayavi建立的對象也就是VTK的對象
import numpy as np from mayavi import mlab #建立數據 t = np.linspace(0,4*np.pi,20) #linspace根據起止數據等間距填充數據,分為20組,所以下面將產生20個點 x = np.sin(2*t) y = np.cos(t) z = np.cos(2*t) s = 2 + np.sin(t) #對數據進行可視化 points = mlab.points3d(x,y,z,s,colormap="Reds",scale_factor=.25) mlab.show()
mlab.points3d(x,y,z,s,colormap="Reds",scale_factor=.25) #x,y,z表示Numpy數組,列表或者其他形式的點三維坐標,s表示在該點處的標量值,scale_factor放縮比例
這里:標量值越大,點的尺寸越大,顏色越紅
points = mlab.points3d(x,y,z,s,colormap="Greens",scale_factor=.25)
Mayavi.mlab.show建立了簡單的GUI,並開始了事件循環,stop用來定義GUI的事件循環是否結束
(二)3D繪圖函數--plot3d(線圖形一維)
import numpy as np from mayavi import mlab #引入mlab庫 #建立數據 n_mer,n_long = 6,11 dphi = np.pi / 1000.0 phi = np.arange(0.0,2*np.pi+0.5*dphi,dphi) mu = phi * n_mer x = np.cos(mu)*(1+np.cos(n_long*mu/n_mer)*0.5) y = np.sin(mu)*(1+np.cos(n_long*mu/n_mer)*0.5) z = np.sin(n_long*mu/n_mer)*0.5 #對數據進行可視化 l = mlab.plot3d(x,y,z,np.sin(mu),tube_radius=0.025,colormap="Spectral") mlab.show()
(三)3D繪圖函數--2D數據(二維)
(1)imshow方法
import numpy as np from mayavi import mlab #建立數據 s = np.random.random((10,10)) #二維數據 #對數據進行可視化 img = mlab.imshow(s,colormap="gist_earth") #gist_earth以地球表面的色彩為顏色的顏色映射關系 mlab.show()
(2)surf方法
s:二維數組第一列表示x軸位置,第二列表示y軸位置,x,y可以是一維或者二維數組,一般情況下,他們都由numpy的mgrid或ogrid得到
import numpy as np from mayavi import mlab def f(x,y): return np.sin(x-y)+np.cos(x+y) x,y = np.mgrid[-7.:7.05:0.1,-5.:5.05:0.05] s = mlab.surf(x,y,f) mlab.show()
mgrid返回兩個二維數組(個數是不固定的,我們放置幾個元素,就會生成幾個二維數組) -7.:7.05:0.1---->最小-7,最大7.05,步長為0.1依次生成一個n*n矩陣
>>> x,y = np.mgrid[-7.:7.05:0.1,-5.:5.05:0.05] >>> x array([[-7. , -7. , -7. , ..., -7. , -7. , -7. ], [-6.9, -6.9, -6.9, ..., -6.9, -6.9, -6.9], [-6.8, -6.8, -6.8, ..., -6.8, -6.8, -6.8], ..., [ 6.8, 6.8, 6.8, ..., 6.8, 6.8, 6.8], [ 6.9, 6.9, 6.9, ..., 6.9, 6.9, 6.9], [ 7. , 7. , 7. , ..., 7. , 7. , 7. ]]) >>> y array([[-5. , -4.95, -4.9 , ..., 4.9 , 4.95, 5. ], [-5. , -4.95, -4.9 , ..., 4.9 , 4.95, 5. ], [-5. , -4.95, -4.9 , ..., 4.9 , 4.95, 5. ], ..., [-5. , -4.95, -4.9 , ..., 4.9 , 4.95, 5. ], [-5. , -4.95, -4.9 , ..., 4.9 , 4.95, 5. ], [-5. , -4.95, -4.9 , ..., 4.9 , 4.95, 5. ]])
(3)contour_surf() 與surf()類似,單求解的是等值線,surf求解的是曲面
import numpy as np from mayavi import mlab def f(x,y): return np.sin(x-y)+np.cos(x+y) x,y = np.mgrid[-7.:7.05:0.1,-5.:5.05:0.05] s = mlab.contour_surf(x,y,f) mlab.show()
(四)3D繪圖函數--3D數據(三維)
(1)contour3d方法
import numpy as np from mayavi import mlab x,y,z = np.ogrid[-5:5:64j,-5:5:64j,-5:5:64j] #64j表示數組長度為64 scalars = x*x + y*y +z*z obj = mlab.contour3d(scalars,contours=8,transparent=True) #contours八個等值面 transparent該對象可以透明表示,可以查看內部 mlab.show()
ogrid返回3個三維數組(幾個是不固定的,我們設置了幾個元素,就生成相對應個三維數組)
>>> x,y,z = np.ogrid[-5:5:64j,-5:5:64j,-5:5:64j] >>> x array([[[-5. ]], #共64個元素 [[-4.84126984]], [[-4.68253968]], .......
[[ 4.68253968]], [[ 4.84126984]], [[ 5. ]]])
(2)quiver3d()方法
(x,y,z表示箭頭位置,二維即可,不需要三維表示)
import numpy as np
from mayavi import mlab
x,y,z = np.mgrid[-2:3,-2:3,-2:3]
r = np.sqrt(x**2 + y**2 + z**4)
u = y*np.sin(r)/(r+0.001)
v = -x*np.sin(r)/(r+0.001)
w = np.zeros_like(z)
obj = mlab.quiver3d(x,y,z,u,v,w,line_width=3,scale_factor=1)
mlab.show()