Python mayavi庫及mayavi管線

Mayavi庫的基本元素
Mayavi庫中主要有兩大部分功能
  一類是用於處理圖形可視化和圖形操做的mlab模塊
  一類是操做管線對象窗口對象的api
mlab包含html

  繪圖函數:實現已有的數據進行可視化顯示,能夠是numpy數組構建的,也能夠是外部讀取的,好比讀取一個文件api

  圖形控制函數:實質上是對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)

運行結果:spa

程序分析:x,y,z數組對應座標的元素組成了三維座標點命令行

ash函數的三個數組參數xyz是二維數組,
他們相同下標的三個元素組成了曲面上某點的三維座標
點之間的鏈接關係好比邊和麪由其在x,y,z數組中間的位置關係所決定
因爲以上程序所計算的曲面是個旋轉體,
曲面上的各個點的座標是在球面座標系中計算的
這些信息能夠在x,y,z的座標計算中獲得
而後根據座標轉換公式將球面座標轉換成xyz座標
按住shift鍵用左鍵對場景進行拖動平移場景或用shift+鍵盤鍵進行拖動
鼠標右鍵上下拖動或使用+-按鍵進行場景縮放
按ctrl鍵+左鍵拖動能夠滾動相機
在程序中,經過傳遞關鍵字representation給mash函數能夠指定繪製的表現形式
若是默認的,是surface咱們能夠換成wireframe或pointsscala

 

Mayavi管線的層級
最高層
Engine:創建和銷燬場景Scene,並不顯示在視圖中
Scence場景:每一個場景下有多個數據集合Sources,爲Mayavi可視化提供了數據
Filter:應用於Scence上對數據進行變換
Module Manager:用來控制顏色,用來表示標量和矢量數據,
在pipline視圖中表示爲Colors and Legends節點
可視化Modules:用於最終數據的顯示,如線條,平面等3d

#能夠經過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的管線,看看它們之間有什麼不一樣

運行結果:指針

相關文章
相關標籤/搜索