1. 程式人生 > >三流Mayavi操作-Mayav-2.1.0 繪製函式,通用引數

三流Mayavi操作-Mayav-2.1.0 繪製函式,通用引數

這一節完全可以先跳過,直接看可能會有斷層感,先看2.1.1之後,需要什麼額外的引數再倒回來看這篇。 這樣寫有一定好處,把共同的部分單拎出來,然後把12個繪圖函式進行分類,一網打盡,這樣可以降低每一篇的篇幅,我的觀點是脈絡第一,py本身為簡潔而來,不能為了內容的完備犧牲篇幅。 然後我再寫某一類繪製函式的時候(比如meshtriangular_mesh歸為一類),可以直接寫它特殊的地方,具備的其他引數,就不再說它的通用引數,必要的話,可以留一個跳轉。然後我可以在控制篇幅的情況下,嘗試寫更多的例子玩,就這樣。 . . . 這一節直接寫12個繪圖函式都具備的通用引數 barchar,contour3d

,contour_surf,flow,imshow,mesh,plot3d,points3d,quiver3d,surf,triangular_mesh 繪製圖形的引數共有35個: auto_scale,color,colormap,contours,extent,figure,interpolate,integration_direction, lateral_scale,line_width,linetype,mask,mask_points,mode,name,opacity,plane_opacity, plane_orientation,representation,reset_zoom
,resolution,scalars,seed_resolution, seed_scale,seed_visible,seedtype,scale_factor,scale_mode,slice_index,transparent, tube_radius,tube_sides,vmax,vmin,warp_scale 不同的繪製函式對應的引數有所不同, 比如barchart繪製函式含有一個auto_scale引數是其他所有函式不具備的,而meshtriangular_mesh的引數卻又完全相同,但是繪製的網格又不一樣。

通用引數

這35個引數中,有9個是所有繪製函式都具備的。以下列出,並一一說明。 color

,colormap,line_width,name,opacity,reset_zoom,transparent,vmax,vmin

color

the color of the vtk object. Overides the colormap, if any, when specified. This is specified as a triplet of float ranging from 0 to 1, eg (1, 1, 1) for white. VTK物件顏色,接受三維浮點陣列 增設引數之後color = (1,1,0) 實際上Actor中你會發現(255,255,0),如果是(0.5,0,0),就會發現(127,0,0)暗紅色 在這裡插入圖片描述

colormap

type of colormap to use. 這個怎麼翻譯呢,要我說就是配色方案 在這裡插入圖片描述 要把Scale visibility勾選了,Color可能會把colormap的配色方案覆蓋掉,當前採用的是 mesh(x, y, z,color=(1,1,0),colormap='Wistia') 這兩者區別在於color配置的是整個實體的顏色,是單一色 colormap配置的是標量的顏色,是漸變色標量!標量!標量!敲黑板!!

line_width

The width of the lines, if any used. Must be a float. Default: 2.0 線寬,處於Actor下,預設值是2.0,我們來試試0.1線寬效果 mesh(x, y, z, representation='wireframe',colormap='Wistia',line_width = 0.1) 在這裡插入圖片描述 是不是很se.qing,sexy!敲漂亮!蟬翼般的效果。

name

the name of the vtk object created. 這個是VTK物件的名字 mesh(x,y,z,name='修改的是這個位置') 預設是GridSourse,被name修改成了。。emm 在這裡插入圖片描述 多說一句,Mayavi Scene1的層級不是最高階,最高階是Engine並沒有顯示在檢視中,它的作用就是建立、銷燬Scenes,而Scenes場景中可以包含不止一個數據集合Sources,Sources為Mayavi視覺化提供資料。也就是說,Scenes下,可以建立不止一組資料來源Sources,比如構造組合體。 這部分內容屬於管線配置,這裡只是BB一下,詳細的內容到2.2再說。 留一個連結:

opacity

The overall opacity of the vtk object. Must be a float. Default: 1.0 VTK物件的整體透明度設定,接受浮點數,預設值是1.0,也就是完全不透明。 這個是一個非常實用的技巧。 mesh(x,y,z,opacity=0.3) 在這裡插入圖片描述 這個在管線裡面也可以寫,只是相對麻煩一些。剝洋蔥。

reset_zoom

Reset the zoom to accomodate the data newly added to the scene. Defaults to True. 對新加入的場景資料放縮排行重置,預設值為True 用一個官方例子來進行說明。

import numpy as np
from mayavi import mlab
x, y = np.mgrid[0:3:1,0:3:1]
s = mlab.surf(x, y, np.asarray(x*0.1, 'd'),
              representation='wireframe')
# mlab.show()                     #a位置
fig = mlab.gcf()
ms = s.mlab_source
for i in range(5):
    x, y = np.mgrid[0:3:1.0/(i+2),0:3:1.0/(i+2)]
    sc = np.asarray(x*x*0.05*(i+1), 'd')
    ms.reset(x=x, y=y, scalars=sc)
    fig.scene.reset_zoom()
    # mlab.show()                     #b位置
mlab.show()                        #c位置

reset_zoom做了一件什麼事呢,就是調整了show的時候的放大倍率,如果只得到結果圖reset_zoom()不必寫進迴圈。但是如果要生成很多過程圖的話,這個動作就很有必要了。每過載一次都需要更新一次場景資料放縮,我把原始碼中的一句註釋去掉了# Animate the data.似乎目的就是生成過程圖。下面是圖 在這裡插入圖片描述

原始碼中abc三個位置都沒加show(),於是產生了一個問題,好奇驅使(畫蛇添足)的我在除錯這段程式碼的時候發現了點問題 1.a位置加上show,出現了一個2X2的影象(wireframe顯示的是網格線),b位置註釋掉,c位置show了一張什麼都沒有的空影象。同時視窗介面變成了Mayavi Scene2, 2.註釋掉a和b位置的show,影象顯示正常,顯示為最終結果,畢竟中間過程的影象被註釋掉了。最終結果呈現的是Mayavi Scene1 3.註釋掉a和c位置,僅保留中間過程的show,結果只能顯示第一次的影象。不得已加上if分別得到了中間的影象,結果和開始想的一樣,只能得到一次Mayavi Scene1,於是喜提一條報錯資訊 . 'NoneType' object has no attribute 'reset_zoom' File "F:\py_78\三維可視\csdn 2.1.1.mesh.py", line 13, in <module>fig.scene.reset_zoom() . 這個報錯是能預見到的,show()reset_zoom()之後,如果show建立了新Scene,那麼迴圈的時候fig.scene.reset_zoom()的是這個新場景。

所以我猜測,show可能清掉了資料,或者修改了fig,使得reset_zoom()報錯了,我還沒能解決這個問題。

transparent

make the opacity of the actor depend on the scalar. 這個是一個奇怪的引數,根據標量的值設定actor的透明度。 我用contour3d來舉個栗子,此處不講 來對比一下 首先是原圖 mlab.contour3d(scalars,contours = 8) 在這裡插入圖片描述 其次是設定了opacity之後的 mlab.contour3d(scalars,contours = 8,opacity = 0.5) 內部已經可以看到了,但是整體效果不好。 在這裡插入圖片描述 最後是transparent mlab.contour3d(scalars,contours = 8,transparent=True) 內部資訊看得到,最外層非常清晰。 在這裡插入圖片描述 講道理最後一個效果確實好很多,標量視覺化繪製了等高。opacitytransparent的不同很明顯了,前者是整體透明度,後者是根據標量的值設定了透明度,標量值越大,mapper對映得越紅,透明度越低,如果需要看到圖形內部,做這樣一個透視是非常有效的方法。

1.現在有一個問題,進一步,如果要過濾一些值,顯示某一部分資訊應該怎麼完成? 2.如何交換透明度,我想讓內部到外部越來越透明,跟栗子相反如何實現?(可以考慮新增負號)

vmaxvmin

vmax is used to scale the colormap. If None, the max of the data will be used vmin is used to scale the colormap. If None, the min of the data will be used 這個是用來控制顏色對映方案的,vmin和vmax的預設值就是值域,對於下面這個例子就是[0,75] 還是用上面那段程式碼好了 x,y,z = np.ogrid[-5:5:64j,-5:5:64j,-5:5:64j] scalars = x*x + y*y + z*z 這裡分別設定了vmin為30和40,影象就是下面兩個。 mlab.contour3d(scalars,contours = 8,transparent=True,vmin=30) mlab.contour3d(scalars,contours = 8,transparent=True,vmin=40) 我試過70,會報錯,但是影象還是出的來,越來越冰涼了哈, vmax也可以試一下,只不過會變紅,低於vmin會被對映為藍色,高於vmax會被對映為紅色,因為預設值是最小值最大值,所以紅色和藍色都只會有一層,之後配色方案colormap將在[vmin,vmax]之間對映。

我猜,報錯的原因是因為顏色變化梯度不夠,所幸報錯之後影象仍然是可以看得到的。 RROR: In D:\Build\VTK\VTK-7.1.1\Common\Core\vtkLookupTable.cxx, line 144 vtkLookupTable (000001BABA99A7E0): Bad table range: [74, 73.3502] 以上是報錯資訊,但我還不知道根本原因,先放在這裡。

在這裡插入圖片描述

以上就是9個通用引數,後期會再補充例子,調整了文章結構,從mesh裡面轉過來降低原來文章的篇幅,讀起來可能會有問題,後期再更。 . . .

填坑區:

更新(18.10.7已更完) 2018.10.07. ——將原來寫的mesh的文調整,貼上過來,大幅度降低文章篇幅。