Python mayavi庫及mayavi管線


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的管線,看看它們之間有什么不同

運行結果:


免責聲明!

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



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