科學計算三維可視化---Mlab基礎(數據可視化)

推文:科學計算三維可視化---TVTK庫可視化實例

使用相關函數:科學計算三維可視化---Mlab基礎(管線控制函數)

一:mlab.pipeline中標量數據可視化

經過持續實例,來感覺mlab對數據可視化的方便性

(一)生成標量數據

等值面:(外層會覆蓋內層)

import numpy as np
from mayavi import mlab

x,y,z = np.ogrid[-10:10:20j,-10:10:20j,-10:10:20j]
s = np.sin(x*y*z)/(x*y*z)

mlab.contour3d(s)  #等值面繪製
mlab.show()

切平面:

import numpy as np
from mayavi import mlab

x,y,z = np.ogrid[-10:10:20j,-10:10:20j,-10:10:20j]
s = np.sin(x*y*z)/(x*y*z)

#繪製兩個方向的切平面
mlab.pipeline.image_plane_widget(mlab.pipeline.scalar_field(s), #scalar_field得到數據的標量數據場
                                 plane_orientation="x_axes",    #設置切平面的方向
                                 slice_index=10
                                 )

mlab.pipeline.image_plane_widget(mlab.pipeline.scalar_field(s),
                                 plane_orientation="y_axes",
                                 slice_index=10
                                 )

#爲這個數據繪製外框
mlab.outline()
mlab.show()

複合觀測方法

import numpy as np
from mayavi import mlab

x,y,z = np.ogrid[-10:10:20j,-10:10:20j,-10:10:20j]
s = np.sin(x*y*z)/(x*y*z)

src = mlab.pipeline.scalar_field(s) #創建標量場數據

mlab.pipeline.iso_surface(src,contours=[s.min()+0.1*s.ptp(),],opacity=0.1)  #iso_surface對輸入體繪製其等值面,記得設置透明度,不然內部數據將被外部遮擋
mlab.pipeline.iso_surface(src,contours=[s.max()-0.1*s.ptp(),])  #也可使用等值面iso_surface,來觀察必定範圍內的數據

#繪製切平面
mlab.pipeline.image_plane_widget(src,   #使用切平面來觀察某一平面的數據細節
                                 plane_orientation="z_axes",    #設置切平面的方向
                                 slice_index=10
                                 )

mlab.show()

二:mlab.pipeline中矢量數據可視化

import numpy as np
from mayavi import mlab

x,y,z = np.mgrid[0:1:20j,0:1:20j,0:1:20j]

#u,v,w是在點x,y,z處的矢量數據
u = np.sin(np.pi*x)*np.cos(np.pi*z)
v = -2*np.sin(np.pi*x)*np.cos(2*np.pi*z)
w = np.cos(np.pi*x)*np.sin(np.pi*z) + np.cos(np.pi*y)*np.sin(2*np.pi*z)

mlab.quiver3d(u,v,w) #quiver3d能夠在數據點處畫出箭頭
mlab.outline()

mlab.show()

上面數據過於密集:可使用降採樣:科學計算三維可視化---TVTK庫可視化實例 

import numpy as np
from mayavi import mlab

x,y,z = np.mgrid[0:1:20j,0:1:20j,0:1:20j]

#u,v,w是在點x,y,z處的矢量數據
u = np.sin(np.pi*x)*np.cos(np.pi*z)
v = -2*np.sin(np.pi*x)*np.cos(2*np.pi*z)
w = np.cos(np.pi*x)*np.sin(np.pi*z) + np.cos(np.pi*y)*np.sin(2*np.pi*z)

src = mlab.pipeline.vector_field(u,v,w) #pipeline的vectors構建了矢量域 mlab.pipeline.vectors(src,mask_points=10,scale_factor=2.0) #mask_points沒10個數據點選取一個,scale_factor放縮比率2.0


mlab.show()

切面觀察矢量數據

import numpy as np
from mayavi import mlab

x,y,z = np.mgrid[0:1:20j,0:1:20j,0:1:20j]

#u,v,w是在點x,y,z處的矢量數據
u = np.sin(np.pi*x)*np.cos(np.pi*z)
v = -2*np.sin(np.pi*x)*np.cos(2*np.pi*z)
w = np.cos(np.pi*x)*np.sin(np.pi*z) + np.cos(np.pi*y)*np.sin(2*np.pi*z)

src = mlab.pipeline.vector_field(u,v,w)
#pipeline的vectors構建了矢量域
mlab.pipeline.vector_cut_plane(src,mask_points=10,scale_factor=2.0) #mask_points沒10個數據點選取一個,scale_factor放縮比率2.0


mlab.show()

另外一個矢量數據重要顯示方法:級數的等值面

級數是矢量域中的重要參數,他能夠顯示數量的法線等值面,咱們經過計算矢量法向獲得一個標量域
import numpy as np
from mayavi import mlab

x,y,z = np.mgrid[0:1:20j,0:1:20j,0:1:20j]

#u,v,w是在點x,y,z處的矢量數據
u = np.sin(np.pi*x)*np.cos(np.pi*z)
v = -2*np.sin(np.pi*x)*np.cos(2*np.pi*z)
w = np.cos(np.pi*x)*np.sin(np.pi*z) + np.cos(np.pi*y)*np.sin(2*np.pi*z)

src = mlab.pipeline.vector_field(u,v,w)
magnitude = mlab.pipeline.extract_vector_norm(src) #extract_vector_norm經過計算矢量法向獲得一個標量域 mlab.pipeline.iso_surface(magnitude,contours=[2.0,0.5]) #構建等值面

mlab.outline()
mlab.show()

 

流線的可視化對矢量數據也很是有意義,在不少應用中,他能夠表示流體力學的軌跡,有能夠表示電磁場線

import numpy as np
from mayavi import mlab

x,y,z = np.mgrid[0:1:20j,0:1:20j,0:1:20j]

#u,v,w是在點x,y,z處的矢量數據
u = np.sin(np.pi*x)*np.cos(np.pi*z)
v = -2*np.sin(np.pi*x)*np.cos(2*np.pi*z)
w = np.cos(np.pi*x)*np.sin(np.pi*z) + np.cos(np.pi*y)*np.sin(2*np.pi*z)

flow = mlab.flow(u,v,w,seed_scale=1,
                 seed_resolution=5,
                 integration_direction="both")

mlab.outline()
mlab.show()

 

 

複合觀測方法

爲矢量場數據給出有意義的矢量觀測是比較有困難的工做,所以一般咱們須要使用不一樣的根據,對矢量數據進行可視化

 

#等值面
iso = mlab.pipeline.iso_surface(magnitude,contours=[2.0,],opacity=0.3) #構建等值面
#矢量場
vec = mlab.pipeline.vectors(magnitude,mask_points=40,line_width=1,
                            color=(0.8,0.8,0.8),
                            scale_factor=4.)
#矢量場流線
flow = mlab.pipeline.streamline(magnitude,seedtype="plane",
                                seed_visible=False,
                                seed_scale=0.5,
                                seed_resolution=1,
                                linetype="ribbon")
#矢量場切平面
vcp = mlab.pipeline.vector_cut_plane(magnitude,mask_points=2,
                                     scale_factor=4,
                                     colormap="jet",
                                     plane_orientation="x_axes")

 

相關文章
相關標籤/搜索