科學計算三維可視化---Mlab基礎(基於Numpy數組的繪圖函數)


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()

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM