Mayavi庫的基本元素
Mayavi庫中主要有兩大部分功能
一類是用於處理圖形可視化和圖形操作的mlab模塊
一類是操作管線對象窗口對象的api
mlab包含
繪圖函數:實現已有的數據進行可視化顯示,可以是numpy數組構建的,也可以是外部讀取的,比如讀取一個文件
圖形控制函數:實質上是對mayavi中的figure進行控制,比如可以通過gcf獲得當前視圖的指針,也可以通過clf來清空當前圖形,通過close關閉當前圖形
圖形修飾函數:對當前繪制的函數進行一定的修飾和裝飾,比如說繪制完圖形之后需要增加一個顏色標識欄
圖形控制函數,其他函數和Mlab管線控制函數或者是對坐標軸增加相應的標簽等,比如使用xlaber可以在x軸上增加相應的標簽
相機控制函數:對相機的操作,比如說move函數來移動相機到某個位置上,使用pitch,roll,yaw函數控制相機進行旋轉等
其他函數:
animate:生成一段動態的可視化效果
get_engine:獲得當前管線的engine
Mlab管線控制:可以設置當前管線的數據源也可以為當前繪制管線增加數據集使用addataset等
Mayavi API
管線基礎對象:可以通過這類函數獲得Mayavi管線的各個基本對象
包括Scene,Source,Filter,ModuleManager,Module,PipelineBase,Engine等
主視窗和UI對象:用於視圖繪制和UI繪制的
比如MayaviScene,SceneEditor等。我們可以在其他庫中構建的用戶界面里嵌入Mayavi窗口
比如可以結合TraitsUI和Mayavi構建一個可交互的三維可視化應用
mayavi的官方網址其中有所有的函數說明地址:
http://docs.enthought.com/mayavi/mayavi/index.html
#快速繪圖實例 ''' mayavi跟tvtk相比提供了更方便的可視化功能 通過調用mlab.mash繪制一個三維空間中圖形的實例 mayavi中mlab模塊提供了方便快捷地繪制三維圖發函數 只要把數據准備好,通常只需要調用一次mlab的函數就可以看到數據的三維可視化效果 ''' >>> x = [[-1,1,1,-1,-1],[-1,1,1,-1,-1]] >>> y = [[-1,-1,-1,-1,-1],[1,1,1,1,1]] >>> z = [[1,1,-1,-1,1],[1,1,-1,-1,1]] >>> from mayavi import mlab >>> s = mlab.mesh(x,y,z)
運行結果:
程序分析:x,y,z數組對應坐標的元素組成了三維坐標點
ash函數的三個數組參數xyz是二維數組,
他們相同下標的三個元素組成了曲面上某點的三維坐標
點之間的連接關系比如邊和面由其在x,y,z數組中間的位置關系所決定
由於以上程序所計算的曲面是個旋轉體,
曲面上的各個點的坐標是在球面坐標系中計算的
這些信息可以在x,y,z的坐標計算中得到
然后根據坐標轉換公式將球面坐標轉換成xyz坐標
按住shift鍵用左鍵對場景進行拖動平移場景或用shift+鍵盤鍵進行拖動
鼠標右鍵上下拖動或使用+-按鍵進行場景縮放
按ctrl鍵+左鍵拖動可以滾動相機
在程序中,通過傳遞關鍵字representation給mash函數可以指定繪制的表現形式
如果默認的,是surface我們可以換成wireframe或points
Mayavi管線的層級
最高層
Engine:建立和銷毀場景Scene,並不顯示在視圖中
Scence場景:每個場景下有多個數據集合Sources,為Mayavi可視化提供了數據
Filter:應用於Scence上對數據進行變換
Module Manager:用來控制顏色,用來表示標量和矢量數據,
在pipline視圖中表示為Colors and Legends節點
可視化Modules:用於最終數據的顯示,如線條,平面等
#可以通過mlab.show_pipline()或點擊左側的第一個按鈕顯示mayavi管線的對話框 #點開以后可以看見左側用樹狀控件顯示的mayavi一系列管線 #為深入了解mayavi管線,我們先注釋掉最后一行通過命令行來了解管線中的對象 from numpy import pi,sin,cos,mgrid from mayavi import mlab #建立數據 dphi, dtheta = pi/250.0, pi/250.0 [phi,theta] = mgrid[0:pi+dphi*1.5:dphi,0:2*pi+dtheta*1.5:dtheta] m0 = 4;m1 = 3;m2 = 2;m3 = 3;m4 = 6;m5 = 2;m6 = 6;m7 = 4; r = sin(m0*phi)**m1 + cos(m2*phi)**m3 +sin(m4*theta)**m5 + cos(m6*theta)**m7 x = r*sin(phi)*cos(theta) y = r*cos(phi) z = r*sin(phi)*sin(theta) #對數據進行三維可視化 s = mlab.mesh(x,y,z) #mlab.show() ''' 管線中的對象scene Mayavi Scene:處於樹的最頂層的對象,表示場景。 其配置界面中可以設置場景的背景,前景色,場景中的燈光及其他一些選項 ''' >>> s = mlab.gcf()#獲取對象的背景色(獲取當前場景) >>> print(s)#輸出當前的對象狀態 <mayavi.core.scene.Scene object at 0x00000009C07DA990> >>> print(s.scene.background)#輸出當前場景的背景色 (0.5, 0.5, 0.5) >>> ''' 下一級GridSource網格數據源 在配置界面中每一項為每個點所對應的標量數據的名稱 在本例中只有一個名為scalars的標量數據, 它是傳遞給mash的數組,它表示mash表面的每個點的數據 ''' >>> source = s.children[0]#獲取GridSource對象 >>> print(repr(source))#返回的字符串是VTKDataSource形式 <mayavi.sources.vtk_data_source.VTKDataSource object at 0x000000F7E93E6E60> >>> print(source.name)#獲取該節點名稱 GridSource >>> print(repr(source.data.points))#GridSource的坐標后面length=多少就是坐標數組大小是多少 [(0.0, 2.0, 0.0), ..., (-0.025048897296365225, -1.9933803751132322, -0.00031479029697865414)], length = 126504 >>> print(repr(source.data.point_data.scalars))#通過print函數打印出每個點對應的標量數組 [0.0, ..., -0.00031479029697865414], length = 126504 >>> ''' 管線中的下一級對象PolydataNormals PolydataNormals是數據源的法向量 ''' >>> manager = source.children[0]#打印出PolydataNormals的相關信息 >>> print(manager) <mayavi.filters.poly_data_normals.PolyDataNormals object at 0x000000F7E9F48D58> >>> ''' 管線中的下一級對象Colors and legends 在colors and legends對象配置頁面中 Scalar LUT選項卡可以設置將標量轉化為顏色的查詢表 例如將LUT_mode改成Blues這樣場景中的物體顏色會顯示成白色到深藍色的漸變 如果勾選選項Show legerd選擇框在場景中將添加一個顏色條來顯示顏色和標量之間的關系 當然,也可以通過程序更改這兩個選項 ''' >>> colors = manager.children[0]#獲取Colors and legends第一個子節點 >>> colors.scalar_lut_manager.lut_mode = 'Blues' >>> colors.scalar_lut_manager.show_legend = True ''' 再在管線的下一級看一下surface對象 surface對象將GridSource輸出的PolyData數據轉換為最終在場景中顯示的三維實體 通過它的配置界面Actor選項卡可以對實體進行配置 例如我們將Reprentation設置成wireframe並將Line width設置為0 則實體最終采用細線框來顯示 同時我們將opasity設為0.6則實體變為半透明的狀態 同樣,我們也可以通過命令行的方式來更改這些屬性 ''' >>> surface = colors.children[0]#獲取colors的第一個子節點 >>> surface.actor.property.representation = 'wireframe' >>> surface.actor.property.opacity = 0.6 >>> mlab.show() ''' 【總結】 程序配置屬性的整個步驟可以描述為 1.獲得場景對象,mlab.gcf() 2.通過每個對象的children屬性,在管線中找到需要修改的對象 3.當其配置窗口中有多個選項卡的時候,或者有多個配置數組框時,屬性需要一級一級獲得 在程序配置屬性的時候,為了方便配置各種屬性的程序,mayavi提供了腳本錄制功能 單機視圖中的紅色圓點,會打開一個腳本對話框 之后的界面配置操作都會被記錄到此對話框中 ''' #思考:對比tvtk和mayavi的管線,看看它們之間有什么不同
運行結果: