文章目錄
- 1. 前言
- 1.1 WxGL是什么?
- 1.2 為什么選擇WxGL?
- 1.3 安裝和依賴關系
- 2. 快速體驗
- 2.1 從正弦曲線開始
- 2.2 使用2D模式
- 2.3 子圖布局
- 2.4 標題和文本
- 2.5 Colorbar
- 2.6 顏色的表示
- 2.7 顏色映射表
- 3. 互動式繪圖函式
- 3.1 新建畫布:figure()
- 3.2 保存畫布為檔案:savefig()
- 3.3 顯示畫布:show()
- 3.4 數值顏色映射:cmap()
- 3.5 添加子圖:subplot()
- 3.6 繪制點和線:plot()函式
- 3.7 繪制散點圖:scatter()函式
- 3.8 繪制mesh:mesh()
- 3.9 繪制surface:surface()
- 3.10 繪制圓管:pipe()
- 3.11 繪制球體:sphere()
- 3.12 繪制六面體:cube()
- 3.13 繪制圓柱體:cylinder()
- 3.14 繪制圓錐體:cone()
- 3.15 繪制三維等值面:capsule()
- 3.16 繪制流體:flow()
- 3.17 繪制標題:title()
- 3.18 繪制文本:text()
- 3.19 繪制Colorbar:colorbar()
- 3.20 繪制網格和刻度:ticks()
- 4. 應用示例
- 4.1 surface()函式的應用
- 4.1.1 扇面
- 4.1.2 紋理
- 4.2 mesh()函式的應用
- 4.2.1 曲面
- 4.2.2 球面
- 4.3 三維等值面
- 4.4 地形圖
- 4.5 雪花飄飄
- 5. 與wxPython集成
- 5.1 WxGLScene API
- 5.1.1 建構式
- 5.1.2 設定眼睛與目標點之間的相對關系
- 5.1.3 恢復初始姿態
- 5.1.4 保存場景為影像檔案
- 5.1.5 添加視區
- 5.1.6 添加子圖
- 5.1.7 自動旋轉
- 5.1.8 停止旋轉
- 5.2 WxGLRegion API
- 5.2.1 建構式
- 5.2.2 重置視區
- 5.2.3 設定坐標軸范圍
- 5.2.4 洗掉模型
- 5.2.5 顯示模型
- 5.2.6 隱藏模型
- 5.2.7 更新視區顯示
- 5.2.8 創建紋理物件
- 5.2.9 繪制2D文字
- 5.2.10 繪制3D文字
- 5.2.11 繪制點
- 5.2.12 繪制線段
- 5.2.13 繪制曲面
- 5.2.14 繪制網格
- 5.2.15 繪制球體
- 5.2.16 繪制六面體
- 5.2.17 繪制圓錐體
- 5.2.18 繪制圓柱體
- 5.2.19 繪制圓管線
- 5.2.20 繪制囊(三維等值面)
- 5.2.21 繪制體資料
- 5.2.22 繪制坐標軸
- 5.2.23 繪制colorBar
- 5.2.24 繪制網格和刻度
- 5.2.25 隱藏刻度網格
- 5.2.26 繪制2D網格和刻度
- 5.2.27 繪制流體
- 5.3 應用示例
1. 前言
1.1 WxGL是什么?
WxGL是一個基于PyOpenGL的三維資料可視化庫,以wx為顯示后端,提供Matplotlib風格的互動式應用模式,同時,也可以和wxPython無縫結合,在wx的表單上繪制三維模型,
WxGL遵循MIT開源軟體許可協議,任何人都可以使用、復制和修改本軟體,甚至出版發行、再授權以及販售本軟體,唯一的限制是,必須附有MIT授權協議,WxGL的原始碼和本文的示例代碼、資源,都可以從https://github.com/xufive/wxgl下載,
從V0.6.2開始,WxGL新增了互動式繪圖子模塊wxplot,提供類似Matplotlib風格的2D/3D繪圖函式,如果熟悉NumPy和Matplotlib的話,只需要幾分鐘時間就可以學會使用WxGL的互動式繪圖,
1.2 為什么選擇WxGL?
WxGL提供了一套簡潔易用、對用戶友好的API,將OpenGL的復雜概念全部封裝起來,使得用戶可以專注于資料的處理,而無需將更多精力用在3D顯示方面,可以說,WxGL是為實作資料快速可視化而誕生的,下面這個例子可以告訴你,WxGL究竟有多簡潔,
>>> import numpy as np
>>> import wxgl.wxplot as plt
>>> vs = np.array([
[1,-1,1], [1,-1,-1], [1,1,-1], [1,1,1],
[-1,1,1], [-1,1,-1], [-1,-1,-1], [-1,-1,1],
[-1,-1,1], [-1,-1,-1], [1,-1,-1], [1,-1,1],
[1,1,1], [1,1,-1], [-1,1,-1], [-1,1,1]
])
>>> plt.surface(vs, texture=r'example\res\girl.jpg', alpha=False)
>>> plt.show(rotation='h+')
前兩行代碼匯入NumPy和WxGL模塊,第3行構造資料,第4行繪制,第5行顯示并增加旋轉效果,只要5行代碼,就可以實作下面的效果,

1.3 安裝和依賴關系
和其他的Python模塊一樣,WxGL模塊也使用pip命令安裝,
pip install wxgl
WxGL依賴以下模塊,如果當前運行環境沒有安裝這些模塊,安裝程式將會自動安裝它們,如果安裝程序出現問題,或者安裝完成后無法正常使用,請嘗試手動安裝WxGL的依賴模塊,
- numpy(推薦版本:1.18.2或更高)
- scipy(推薦版本:1.4.1或更高)
- freetype(推薦版本:2.1.0.post1)
- matplotlib(推薦版本:3.1.2或更高)
- wxpython(推薦版本:4.0.7.post2或更高)
- pyopengl(推薦版本:3.1.3b2或更高)
2. 快速體驗
下面例子中用到的繪圖函式,在本文第3部分“互動式繪圖函式”中均有詳細的使用說明,
2.1 從正弦曲線開始
>>> import numpy as np
>>> import wxgl.wxplot as plt
>>> x = np.linspace(0, 2*np.pi, 361)
>>> y = np.sin(x) * 3
>>> plt.plot(x, y)
>>> plt.show()
上面這幾行代碼,畫出了一條正弦曲線,如果忽略模塊名的話,這些代碼和Matplotlib是完全一樣的,除去匯入模塊和資料準備,真正的繪圖陳述句只有最后兩行,執行最后一句show()命令后,將彈出GUI視窗,同時程式將阻塞,直至關閉GUI視窗,

2.2 使用2D模式
對于2D資料來說,使用2D模式繪制,看起來會更習慣一點,
>>> theta = np.linspace(0, 2*np.pi, 361)
>>> x = 3 * np.cos(theta)
>>> y = 3 * np.sin(theta)
>>> fig = plt.figure(mode='2D')
>>> plt.plot(x, y)
>>> plt.show()
這段代碼,首先準備繪制圓的資料,然后使用wxplot.figure()生成畫布,同時指定使用2D繪圖模式,

2.3 子圖布局
WxGL支持在一張畫布上畫多張子圖,創建子圖的方式也非常類似Matplotlib,下面使用wxplot.sphere()函式繪制兩個球體,
- 創建子圖方式一:
>>> plt.subplot(121) # 一行兩列的第一個位置
>>> plt.sphere((0,0,0), 3, 'green')
>>> plt.subplot(122) # 一行兩列的第二個位置
>>> plt.sphere((0,0,0), 3, '#00FFFF', mode='FCBC')
>>> plt.show()
- 創建子圖方式二:
>>> ax1 = plt.subplot(121) # 一行兩列的第一個位置
>>> ax1.sphere((0,0,0), 3, 'green')
>>> ax2 = plt.subplot(122) # 一行兩列的第二個位置
>>> ax2.sphere((0,0,0), 3, '#00FFFF', mode='FCBC')
>>> plt.show()
- 創建子圖方式三:
>>> fig = plt.figure()
>>> ax1 = fig.add_axes(121) # 一行兩列的第一個位置
>>> ax1.sphere((0,0,0), 3, 'green')
>>> ax2 = fig.add_axes(122) # 一行兩列的第二個位置
>>> ax2.sphere((0,0,0), 3, '#00FFFF', mode='FCBC')
>>> plt.show()
上面三種方式創建的子圖,繪制效果是完全一致的,圖中的網格線和標注,是通過點擊工具列上的工具按鈕生成的,再次點擊則可以隱藏,工具列按鈕從左至右,分別是:恢復初始姿態、顯示/隱藏坐標軸、顯示/隱藏網格刻度、設定配色方案、保存為檔案,

除了可以接受3位數字的引數外,subplot()和add_axes()還可以接受4元組引數,用來指定子圖左下角在畫布上的位置,以及子圖的寬度和高度,
2.4 標題和文本
和Matplotlib類似,wxplot也提供了title()和text()兩個函式來繪制標題和文本,除了文本內容,這兩個函式還可以接受文本大小、位置、顏色、字體、對齊方式等若干引數,
>>> plt.cube((0,0,0), 3, 'cyan') # 繪制六面體,cyan是顏色,十六進制表示為#00FFFF
>>> plt.sphere((0,0,0), 1.5, 'orange') # 繪制球
>>> plt.cylinder((0,0,-2), (0,0,2), 0.5, 'green') # 繪制圓柱
>>> plt.cone((0,-2,0), (0,2,0), 0.5, 'purple') # 繪制圓錐,purple是顏色,十六進制表示為#F020F0
>>> plt.title('六面體、圓錐、圓柱和球的組合') # 繪制標題
>>> plt.text('這是錐尖', size=40, pos=(0,2,0), align='left') # 繪制文本
>>> plt.show()
繪制六面體、圓錐、圓柱和球的函式將在本文的第3部分給出詳細的API說明,

2.5 Colorbar
只需要提供值域范圍、顏色映射表名字,wxplot.colorbar()就可以輕松畫出Colorbar,默認位置在畫布或子圖的右側,使用引數loc可以指定Colorbar的位置,
>>> x, y = np.mgrid[-1:1:20j,-1:1:20j]
>>> z = x*x + y*y
>>> plt.mesh(x, y, z, mode='FLBL', cmap='hsv') # 其實,mesh()函式默認使用的顏色映射表就是hsv
>>> plt.colorbar((z.min(), z.max()), 'hsv') # colorbar()的顏色映射表要和要和繪圖函式一致
>>> plt.show()
這段代碼使用wxplot.mesh()函式畫出了曲面 z = x 2 + y 2 z = x^2 + y^2 z=x2+y2的樣子(x和y取值均在在[-1,1]之間),mesh()函式默認使用的顏色映射表是hsv,因此,colorbar的顏色映射表也使用相同的名字

2.6 顏色的表示
表示多個顏色時,WxGL限定使用NumPy陣列,也就是numpy.ndarray型別,顏色陣列的最后一個維度表示顏色通道,可以是RGB模式,也可以是RGBA模式,各個顏色通道的值域范圍在[0,1]之間,
表示單個顏色時,WxGL支持串列、元組或陣列的表示形式(值域范圍限定在[0,1]之間),也支持類似"#FF00FF"的十六進制表示法,此外,WxGL還提供了若干預定義的顏色,使用plt.fig.cm.colors可以查看所有的預定義顏色,
>>> plt.fig.cm.colors
{'red': '#FF0000', 'red_dark': '#C00000', 'green': '#00C000', 'green_dark': '#008000', 'blue': '#0000FF', 'blue_dark': '#0000C0', 'yellow': '#FFFF00', 'orange': '#FFA500', 'purple': '#F020F0', 'purple_dark': '#C000C0', 'cyan': '#00FFFF', 'cyan_dark': '#00C0C0', 'gray': '#C0C0C0', 'dark': '#808080', 'black': '#000000', 'white': '#FFFFFF'}
- red: #FF0000,紅色
- red_dark: #C00000,暗紅色
- green: #00C000,綠色
- green_dark: #008000,暗綠色
- blue: #0000FF,藍色
- blue_dark: #0000C0,暗藍色
- yellow: #FFFF00,黃色
- orange: #FFA500,橘色
- purple: #F020F0,紫色
- purple_dark: #C000C0,暗紫色
- cyan: #00FFFF,青色
- cyan_dark: #00C0C0,暗青色
- gray: #C0C0C0,淺灰色
- dark: #808080,深灰色
- black: #000000,黑色
- white: #FFFFFF,白色
2.7 顏色映射表
WxGL預定了若干顏色映射方案,使用plt.fig.cm.cms.keys()可以查看所有的預定義顏色映射表,
dict_keys([
'autumn', 'brg', 'CMRmap', 'cool', 'cubehelix',
'gist_earth', 'gist_rainbow', 'gist_stern',
'gnuplot', 'gray', 'gray_r', 'hsv', 'jet',
'ocean', 'rainbow', 'spring', 'summer',
'terrain', 'winter', 'Wistia', 'wind'
])
3. 互動式繪圖函式
wxplot函式自帶完備的檔案說明,只需要使用__doc__查看即可,
3.1 新建畫布:figure()
>>> print(plt.figure.__doc__)
新建畫布
Useage: figure(*args, **kwds)
----------------------------------------------------
size - 畫布解析度,默認800x600
kwds - 關鍵字引數
head - 定義方向:'x+'|'y+'|'z+'
zoom - 視口縮放因子
mode - 2D/3D模式
elevation - 仰角
azimuth - 方位角
style - 配色方案,'black'|'white'|'gray'|'blue'
3.2 保存畫布為檔案:savefig()
>>> print(plt.savefig.__doc__)
保存畫布為檔案
Useage: savefig(fn, alpha=False)
----------------------------------------------------
fn - 檔案名
alpha - 透明通道開關
3.3 顯示畫布:show()
>>> print(plt.savefig.__doc__)
顯示畫布
Useage: show(rotation=None, **kwds)
----------------------------------------------------
rotation - 旋轉模式
None - 無旋轉
'h+' - 水平順時針旋轉(默認方式)
'h-' - 水平逆時針旋轉
'v+' - 垂直前翻旋轉
'v-' - 垂直后翻旋轉
kwds - 關鍵字引數
elevation - 初始仰角,以度(°)為單位,默認值為0
azimuth - 初始方位角以度(°)為單位,默認值為0
step - 幀增量,以度(°)為單位,默認值為5
interval - 幀間隔,以ms為單位,默認值為20
3.4 數值顏色映射:cmap()
>>> print(plt.cmap.__doc__)
數值顏色映射
Useage: cmap(data, cm, **kwds)
----------------------------------------------------
data - 資料
cm - 顏色映射表名
kwds - 關鍵字引數
invalid - 無效資料的標識
invalid_c - 無效資料的顏色
datamax - 資料最大值,默認為None
datamin - 資料最小值,默認為None
alpha - 透明度,None表示回傳RGB格式
3.5 添加子圖:subplot()
>>> print(plt.subplot.__doc__)
添加子圖
Useage: subplot(pos, padding=(20,20,20,20))
----------------------------------------------------
pos - 子圖在畫布上的位置和大小
三位數字 - 指定分割畫布的行數、列數和子圖序號,例如,223表示兩行兩列的第3個位置
四元組 - 以畫布左下角為原點,寬度和高度都是1,四元組分別表示子圖左下角在畫布上的水平、垂直位置和寬度、高度
padding - 四元組,上、右、下、左四個方向距離邊緣的留白像素
3.6 繪制點和線:plot()函式
>>> print(plt.plot.__doc__)
繪制點和線
Useage: plot(xs, ys, zs=None, color=None, size=0.0, width=1.0, style='solid', cmap='hsv', caxis='z')
----------------------------------------------------
xs/ys/zs - 頂點的x/y/z坐標集,元組、串列或一維陣列型別,長度相等,若zs為None,則自動補為全0的陣列
color - 全部或每一個頂點的顏色,None表示使用cmap引數映射顏色
size - 頂點的大小,整型或浮點型,若為0,則表示不繪制點,只繪制線
width - 線寬,0.0~10.0之間的浮點數,若為0,則表示不繪制線,只繪制點
style - 線型
'solid' - 實線
'dashed' - 虛線
'dotted' - 點線
'dash-dot' - 虛點線
cmap - 顏色映射表,color為None時有效
caxis - 用于顏色映射的坐標軸資料,2D模式下自動轉為'y'
3.7 繪制散點圖:scatter()函式
>>> print(plt.scatter.__doc__)
繪制散點圖
Useage: scatter(vs, color=None, size=1.0, cmap='hsv', caxis='z')
----------------------------------------------------
vs - 頂點坐標集,numpy.ndarray型別,shape=(n,3)
color - 頂點顏色或顏色集,None表示使用cmap引數映射顏色
size - 頂點的大小,整型或浮點型
cmap - 顏色映射表,color為None時有效,使用vs的z坐標映射顏色
caxis - 用于顏色映射的坐標軸資料,2D模式下自動轉為'y'
3.8 繪制mesh:mesh()
>>> print(plt.mesh.__doc__)
繪制mesh
Useage: mesh(xs, ys, zs, color=None, mode='FCBC', cmap='hsv', caxis='z', light=None)
----------------------------------------------------
xs/ys/zs - 頂點的x/y/z坐標集,二維陣列
color - 頂點顏色或顏色集,None表示使用cmap引數映射顏色
mode - 顯示模式
'FCBC' - 前后面填充顏色FCBC
'FLBL' - 前后面顯示線條FLBL
'FCBL' - 前面填充顏色,后面顯示線條FCBL
'FLBC' - 前面顯示線條,后面填充顏色FLBC
cmap - 顏色映射表,color為None時有效,使用zs映射顏色
caxis - 用于顏色映射的坐標軸資料,2D模式下自動轉為'y'
light - 材質燈光顏色,None表示關閉材質燈光
3.9 繪制surface:surface()
>>> print(plt.surface.__doc__)
繪制surface
Useage: surface(vs, color=None, method='Q', mode='FCBC', texture=None, alpha=True, light=None)
----------------------------------------------------
vs - 頂點坐標集,二維陣列型別,shape=(n,3)
color - 頂點顏色或顏色集,可以混合使用紋理,None表示僅使用紋理
method - 繪制方法
'Q' - 四邊形
0--3 4--7
| | | |
1--2 5--6
'T' - 三角形
0--2 3--5
\/ \/
1 4
'Q+' - 邊靠邊的連續四邊形
0--2--4
| | |
1--3--5
'T+' - 邊靠邊的連續三角形
0--2--4
\/_\/_\
1 3 5
'F' - 扇形
'P' - 多邊形
mode - 顯示模式
'FCBC' - 前后面填充顏色FCBC
'FLBL' - 前后面顯示線條FLBL
'FCBL' - 前面填充顏色,后面顯示線條FCBL
'FLBC' - 前面顯示線條,后面填充顏色FLBC
texture - 用于紋理的影像檔案,僅當method為Q時有效
alpha - 紋理是否使用透明通道,僅當texture存在時有效
light - 材質燈光顏色,None表示關閉材質燈光
3.10 繪制圓管:pipe()
>>> print(plt.pipe.__doc__)
繪制圓管
Useage: pipe(vs, radius, color=None, slices=36, mode='FCBC', cmap='hsv', caxis='z')
----------------------------------------------------
vs - 頂點坐標集,numpy.ndarray型別,shape=(n,3)
radius - 圓管半徑,浮點型
color - 頂點顏色或顏色集,None表示使用cmap引數映射顏色
slices - 圓管面分片數(數值越大越精細)
mode - 顯示模式
'FCBC' - 前后面填充顏色FCBC
'FLBL' - 前后面顯示線條FLBL
'FCBL' - 前面填充顏色,后面顯示線條FCBL
'FLBC' - 前面顯示線條,后面填充顏色FLBC
cmap - 顏色映射表,color為None時有效,使用vs的z坐標映射顏色
caxis - 用于顏色映射的坐標軸資料,2D模式下自動轉為'y'
3.11 繪制球體:sphere()
>>> print(plt.sphere.__doc__)
繪制球體
Useage: sphere(center, radius, color, slices=60, mode='FLBL')
----------------------------------------------------
center - 球心坐標,元組、串列或陣列
radius - 半徑,浮點型
color - 頂點顏色或顏色集,None表示使用cmap引數映射顏色
slices - 球面分片數(數值越大越精細)
mode - 顯示模式
'FCBC' - 前后面填充顏色FCBC
'FLBL' - 前后面顯示線條FLBL
'FCBL' - 前面填充顏色,后面顯示線條FCBL
'FLBC' - 前面顯示線條,后面填充顏色FLBC
3.12 繪制六面體:cube()
>>> print(plt.cube.__doc__)
繪制六面體
Useage: cube(center, side, color, mode='FLBL')
----------------------------------------------------
center - 中心坐標,元組、串列或陣列
side - 棱長,整型、浮點型,或長度為3的元組、串列陣列
color - 頂點顏色或顏色集,None表示使用cmap引數映射顏色
mode - 顯示模式
'FCBC' - 前后面填充顏色FCBC
'FLBL' - 前后面顯示線條FLBL
'FCBL' - 前面填充顏色,后面顯示線條FCBL
'FLBC' - 前面顯示線條,后面填充顏色FLBC
3.13 繪制圓柱體:cylinder()
>>> print(plt.cylinder.__doc__)
繪制圓柱體
Useage: cylinder(v_top, v_bottom, radius, color, slices=60, mode='FCBC')
----------------------------------------------------
v_top - 圓柱上端面的圓心坐標,元組、串列或numpy陣列
v_bottom - 圓柱下端面的圓心坐標,元組、串列或numpy陣列
radius - 半徑,浮點型
color - 頂點顏色或顏色集,None表示使用cmap引數映射顏色
slices - 圓柱面分片數(數值越大越精細)
mode - 顯示模式
'FCBC' - 前后面填充顏色FCBC
'FLBL' - 前后面顯示線條FLBL
'FCBL' - 前面填充顏色,后面顯示線條FCBL
'FLBC' - 前面顯示線條,后面填充顏色FLBC
3.14 繪制圓錐體:cone()
>>> print(plt.cone.__doc__)
繪制圓錐體
Useage: cone(center, spire, radius, color, slices=60, mode='FCBC')
----------------------------------------------------
center - 錐底圓心坐標,元組、串列或陣列
spire - 錐尖坐標,元組、串列或陣列
radius - 半徑,浮點型
color - 頂點顏色或顏色集,None表示使用cmap引數映射顏色
slices - 錐面分片數(數值越大越精細)
mode - 顯示模式
'FCBC' - 前后面填充顏色FCBC
'FLBL' - 前后面顯示線條FLBL
'FCBL' - 前面填充顏色,后面顯示線條FCBL
'FLBC' - 前面顯示線條,后面填充顏色FLBC
3.15 繪制三維等值面:capsule()
>>> print(plt.capsule.__doc__)
繪制囊(三維等值面)
Useage: capsule(data, threshold, color, r_x=None, r_y=None, r_z=None, mode='FCBC', **kwds)
----------------------------------------------------
data - 資料集,numpy.ndarray型別,shape=(layers,rows,cols)
threshold - 閾值,浮點型
color - 表面顏色
r_x - x的動態范圍,元組
r_y - y的動態范圍,元組
r_z - z的動態范圍,元組
mode - 顯示模式
None - 使用當前設定
'FCBC' - 前后面填充顏色FCBC
'FLBL' - 前后面顯示線條FLBL
'FCBL' - 前面填充顏色,后面顯示線條FCBL
'FLBC' - 前面顯示線條,后面填充顏色FLBC
kwds - 關鍵字引數
name - 模型名
inside - 是否更新資料動態范圍
visible - 是否顯示
3.16 繪制流體:flow()
>>> print(plt.flow.__doc__)
繪制流體
Useage: flow(ps, us, vs, ws, **kwds)
----------------------------------------------------
ps - 頂點坐標集,numpy.ndarray型別,shape=(n,3)
us - 頂點u分量集,numpy.ndarray型別,shape=(n,)
vs - 頂點v分量集,numpy.ndarray型別,shape=(n,)
ws - 頂點w分量集,numpy.ndarray型別,shape=(n,)
kwds - 關鍵字引數
color - 軌跡線顏色,None表示使用速度映射顏色
actor - 頂點模型型別,'point'|'line'兩個選項
size - point大小
width - line寬度
length - 軌跡線長度,以速度矢量的模為單位
duty - 頂點line模型長度與軌跡線長度之比(占空比),建議值為0.4
frames - 總幀數
interval - 幀間隔,以ms為單位
threshold - 高通閾值,濾除速度小于閾值的資料點
name - 模型名
3.17 繪制標題:title()
>>> print(plt.title.__doc__)
繪制標題
Useage: title(text, size=96, color=None, pos=(0,0,0), **kwds)
----------------------------------------------------
text - 文本字串
size - 文字大小,整形
color - 文本顏色,預定義的顏色,或長度為3的串列或元組
pos - 文本位置,list或numpy.ndarray型別,shape=(3,)
kwds - 關鍵字引數
align - left/right/center分別表示左對齊、右對齊、居中(默認)
valign - top/bottom/middle分別表示上對齊、下對齊、垂直居中(默認)
family - (系統支持的)字體
weight - light/bold/normal分別表示字體的輕、重、正常(默認)
3.18 繪制文本:text()
>>> print(plt.text.__doc__)
繪制文本
Useage: text(text, size=64, color=None, pos=(0,0,0), **kwds)
----------------------------------------------------
text - 文本字串
size - 文字大小,整形
color - 文本顏色,預定義的顏色,或長度為3的串列或元組
pos - 文本位置,list或numpy.ndarray型別,shape=(3,)
kwds - 關鍵字引數
align - left/right/center分別表示左對齊、右對齊、居中(默認)
valign - top/bottom/middle分別表示上對齊、下對齊、垂直居中(默認)
family - (系統支持的)字體
weight - light/bold/normal分別表示字體的輕、重、正常(默認)
3.19 繪制Colorbar:colorbar()
>>> print(plt.colorbar.__doc__)
繪制colorbar
Useage: colorbar(drange, cmap, loc, **kwds)
----------------------------------------------------
drange - 值域范圍,tuple型別
cmap - 調色板名稱
loc - 位置,top|bottom|left|right
kwds - 關鍵字引數
length - ColorBar所在視區的長邊長度,默認短邊長度為1
subject - 標題
subject_size - 標題字號
label_size - 標注字號
label_format - 標注格式化所用lambda函式
tick_line - 刻度線長度
endpoint - 刻度是否包含值域范圍的兩個端點值
name - 模型名
inside - 是否資料動態范圍
visible - 是否顯示
3.20 繪制網格和刻度:ticks()
>>> print(plt.ticks.__doc__)
繪制網格和刻度
Useage: subplot(**kwds)
----------------------------------------------------
kwds - 關鍵字引數
segment_min - 標注最少分段數量
segment_max - 標注最多分段數量
label_2D3D - 標注試用2D或3D文字
label_size - 標注字號
xlabel_format - x軸標注格式化所用lambda函式
ylabel_format - y軸標注格式化所用lambda函式
zlabel_format - z軸標注格式化所用lambda函式
4. 應用示例
雖然前面給出了很多幾何體的繪制函式,但三維繪圖絕不只是繪制規則的幾何體,而是要表現紛繁復雜的現實的和虛擬的空間,在三維繪圖函式中,最重要、最常用、同時也是最難以理解的是surface()函式和mesh()函式,
4.1 surface()函式的應用
OpenGL總共有10種圖元繪制方法,如下表所示,其中的前4種方式用于繪制點和線,后6種方式用于繪制面,surface()函式整合了后面的6種圖元繪制方法,使用method引數可以指定繪制方法(詳見3.9節),
| 引數 | 說明 |
|---|---|
| GL_POINTS | 繪制一個或多個頂點 |
| GL_LINES | 繪制線段 |
| GL_LINE_STRIP | 繪制連續線段 |
| GL_LINE_LOOP | 繪制閉合的線段 |
| GL_POLYGON | 繪制多邊形 |
| GL_TRIANGLES | 繪制一個或多個三角形 |
| GL_TRIANGLE_STRIP | 繪制連續三角形 |
| GL_TRIANGLE_FAN | 繪制多個三角形組成的扇形 |
| GL_QUADS | 繪制一個或多個四邊形 |
| GL_QUAD_STRIP | 繪制連續四邊形 |
4.1.1 扇面
使用原生的OpenGL繪圖時,通常需要先準好一組頂點,然后指定使用哪一種方式繪制,這里邊暗含著頂點順序的重要性,以畫扇面為例,需要在15°到165°之間生成弧線上的一組點,假設扇面在 y o z yoz yoz平面上,這些點的x坐標則上下交替,將扇面的圓心點(0,0,0)加到剛才生成的一組點的起始位置,也就是第1個頂點,
>>> theta = np.linspace(np.pi/12, 11*np.pi/12, 21) # 在15°到165°之間生成21個點
>>> y = np.cos(theta) * 10 # 弧線上點的y坐標
>>> z = np.sin(theta) * 10 # 弧線上點的y坐標
>>> x = np.array([i%2-0.5 for i in range(21)]) # 弧線上點的x坐標,上下交替
>>> vs = np.stack((x,y,z), axis=1) # 組合成頂點坐標,此時vs的shape是(21,3)
>>> vs = np.vstack((np.array([0,0,0]), vs)) # 將原點加到vs的首位,此時vs的shape是(22,3)
繪制扇面,就是繪制連續三角形,第1個三角形由頂點1、頂點2、頂點3組成,第2個三角形由頂點1、頂點3、頂點4組成,……,以此類推,
>>> cs = plt.cmap(vs[:,0], 'wind') # 將x的值映射為顏色,使用wind映射表
>>> plt.surface(vs, color=cs, method='F', mode='FLBC')
>>> plt.show(rotation='h+')
這里surface()函式,引數method為’F’,也就是GL_TRIANGLE_FAN的方法,繪制多個三角形組成的扇形;引數mode為’FLBC’,意為前面渲染線條后面渲染顏色,呈現出前后不同的視覺效果,show()函式也使用了自動旋轉引數(詳見3.3節),

4.1.2 紋理
surface()函式支持使用紋理,使用默認引數的話,只需要傳入紋理圖片路徑就可以了,
>>> vs = np.array([
[1,-1,1], [1,-1,-1], [1,1,-1], [1,1,1],
[-1,1,1], [-1,1,-1], [-1,-1,-1], [-1,-1,1],
[-1,-1,1], [-1,-1,-1], [1,-1,-1], [1,-1,1],
[1,1,1], [1,1,-1], [-1,1,-1], [-1,1,1]
])
>>> plt.surface(vs, texture=r'example\res\girl.jpg', alpha=False)
>>> plt.show(rotation='h+')
如果你有女朋友的照片,只需要三行代碼就可以做一個這樣的禮物送給她了,要是你有多位女朋友也沒關系,你可以每4個頂點呼叫一次surface()函式,最多可以將6位女朋友的照片貼到一個六面體上,不過,多位女朋友照片組成的六面體,只能自己欣賞,不適合送給女朋友哦,你若因此被某位女朋友揍得鼻青臉腫,可別怪我沒有提前警告過你,

4.2 mesh()函式的應用
mesh()函式也是用來繪制曲面的,它和surface()函式的不同之處在于,mesh()函式的頂點是基于一個假象的二維網格,surface()函式需要傳入一組頂點,mesh()函式則需要分別傳入一組頂點的x、y、z坐標,并且對應著假象的二維網格的x、y、z坐標, mesh()函式之所以令人困惑,是因為這個假象的二維網格有時候是真正的資料是重合的,
4.2.1 曲面
先生成一個二維網格的x坐標和y坐標,
>>> y, x = np.mgrid[-2:2:50j,-2:2:50j]
>>> x.shape
(50, 50)
>>> y.shape
(50, 50)
顯然,這是一個50x50的二維網格,x和y的值域范圍都是 [ ? 2 , 2 ] [-2,2] [?2,2],分別令網格的每個點的z坐標都是0,以及 z = 2 x e ? ( x 2 + y 2 ) z=2xe^{-(x^2+y^2)} z=2xe?(x2+y2),繪制兩個曲面,
>>> z1 = np.zeros_like(x)
>>> z2 = 2*x*np.exp(-x**2-y**2)
>>> ax1 = plt.subplot(121)
>>> ax1.mesh(x, y, z1, mode='FLBL')
>>> ax2 = plt.subplot(122)
>>> ax2.mesh(x, y, z2, mode='FLBC')
>>> plt.show()
左側網格和假象的網格是一致的,右側則是我們真正想要繪制的網格

4.2.2 球面
先生成球面資料,
>>> lats, lons = np.mgrid[-np.pi/2:np.pi/2:91j, 0:2*np.pi:181j]
>>> xs = np.cos(lats)*np.cos(lons)
>>> ys = np.cos(lats)*np.sin(lons)
>>> zs = np.sin(lats)
>>> xs.shape, ys.shape, zs.shape
((91, 181), (91, 181), (91, 181))
這里,xs、ys、zs分別是球面上點的x、y、z坐標集,同時又都是二維的陣列,對應著一個假象的二維網格,
>>> plt.mesh(xs, ys, zs, color=(0,1,0), light=(0,1,0))
>>> plt.show()
因為使用了燈光引數,所以繪制出的球面有亮暗變化,效果如下,

如果將假象的網格視為如下所示的等經緯地圖,就可以將這張圖映射到球面上,

地圖的解析度是1000x500,因此假象的網格也是1000x500的解析度,
lats, lons = np.mgrid[-np.pi/2:np.pi/2:500j, 0:2*np.pi:1000j]
xs = np.cos(lats)*np.cos(lons)
ys = np.cos(lats)*np.sin(lons)
zs = np.sin(lats)
im = Image.open(=r'example\res\earth.png')
cs = np.array(im)/255 # 影像顏色值域范圍是[0,255],需要變為[0,1]
plt.mesh(xs, ys, zs, color=cs[::-1]) # 顏色逆序
plt.show(rotation='h-')
我們假象的網格,北極為+90°,南極為-90°,從上而下是遞減的,而上面的地圖資料,行號從上而下是遞增的,因此在傳參是需要逆序,最終效果如下圖所示,

4.3 三維等值面
先來構造一個30層高、水平解析度是50x50的資料體,每個格點的資料隨機生成;然后在其中隱藏一個空心圓椎面,設定圓椎面上的格點值為10,
>>> theta = np.linspace(0, 2*np.pi, 180)
>>> _x = np.cos(theta)
>>> _y = np.sin(theta)
>>> data = np.random.random((30,50,50))
>>> for i in range(30):
>>> x = _x*i/2 + 25
>>> x = x.astype(np.int)
>>> y = _y*i/2 + 25
>>> y = y.astype(np.int)
>>> data[i][(x,y)] = 10
呼叫capsule()函式,即可從資料體找出資料值為10的等值面,
plt.capsule(data, 10, '#C020C0', r_x=(0,50), r_y=(0,50), r_z=(0,30), mode='FCBC')
plt.show()
如果資料體解析度足夠高,等值面就會足夠光滑,

4.4 地形圖
從網上可以下載到地形地貌資料,這些資料一般包括經度資料集、緯度資料集、高度資料集和地貌資料集,landforms.npz保存了濟南地區(東經116.65°-117.65°、北緯36.25°-37.00°)的地形地貌資料,使用np.load()可以直接加載,
>>> data = np.load(=r'example\res\landforms.npz')
>>> lon = data['lon']
>>> lat = data['lat']
>>> height = data['height']
>>> landforms = data['landforms']
>>> lons, lats = np.meshgrid(lon, lat) # 生成經緯度網格
>>> plt.mesh(lons, lats, height/50000, color=landforms/255)
>>> plt.show()
高度資料的單位是米,經緯度的單位是度,每度相當于100千米,因此高度資料需要除以100000,這里只除以50000,是為了有更好的視覺效果,地貌資料的值域范圍是[0,255],除以255變成[0,1],下圖中濟南市北部(下方)的黃河、南部(上方)的群山都清晰可見,

4.5 雪花飄飄
WxGL嘗試使用flow()函式展示粒子系統的部分功能,并使用了可編程管線技術(但并未開放介面),下面的代碼,前半部分是地形繪制,然后在4500米~5000米的高度上隨機生成了500個雪花初始點,并使用u/v/w分量形式指定雪花的降落速度,最后使用flow()函式繪制出雪花飄落的樣子,使用flow()函式需要仔細斟酌各個引數,具體細節詳見3.16節,
>>> data = np.load(=r'example\res\landforms.npz')
>>> lon = data['lon']
>>> lat = data['lat']
>>> height = data['height']
>>> landforms = data['landforms']
>>> lons, lats = np.meshgrid(lon, lat) # 生成經緯度網格
>>> plt.mesh(lons, lats, height/50000, color=landforms/255)
>>> x = 116.65 + np.random.random(500) * (117.65-116.65) # 隨機生成500個雪花點x坐標
>>> y = 36.25 + np.random.random(500) * (37.00-36.25) # 隨機生成500個雪花點y坐標
>>> z = 4500 + np.random.random(500) * 500 # 隨機生成500個雪花點z坐標(4500米~5000米)
>>> vs = np.stack((x,y,z/10000), axis=1) # 合并成500個頂點坐標
>>> u = np.sin(3*x) # 雪花在東西方的速度分量
>>> v = np.cos(4*y) # 雪花在南北方的速度分量
>>> w = -10 - np.random.random(500) # 雪花垂直方向的速度分量
>>> plt.flow(vs, u/100, v/100, w/100, length=4, frames=30, interval=50, color=(0.8,0.8,0.8), actor='point', size=3)
>>> plt.ticks(zlabel_format=lambda z:'%0.1fkm'%(z*10))
>>> plt.show()
需要特別指出,這段代碼還使用了ticks()函式設定網格和標注,ticks()函式接受lambda函式作為坐標軸標注的格式化函式,這里僅演示了如何格式化z軸的標注,

5. 與wxPython集成
WxGL的容器名為WxGLScene,稱為場景,WxGLScene是wx.glcanvas.GLCanvas的派生類,因此WxGL和wxPython的集成是天然無縫的,不存在任何障礙,
每個場景可以使用add_region()生成多個WxGLRegion物件,稱為視區,在視區內可以創建模型,每個模型由一個或多個組件構成——所謂組件,可以理解為子模型,
5.1 WxGLScene API
5.1.1 建構式
WxGLScene.__init__(parent, head=‘z+’, zoom=1.0, proj=‘cone’, mode=‘3D’, style=‘black’, **kwds)
parent - 父級視窗物件
head - 觀察者頭部的指向,字串
'x+' - 頭部指向x軸正方向
'y+' - 頭部指向y軸正方向
'z+' - 頭部指向z軸正方向
zoom - 視口縮放因子
proj - 投影模式,字串
'ortho' - 平行投影
'cone' - 透視投影
mode - 2D/3D模式,字串
style - 場景風格
'black' - 背景黑色,文本白色
'white' - 背景白色,文本黑色
'gray' - 背景淺灰色,文本深藍色
'blue' - 背景深藍色,文本淡青色
kwds - 關鍵字引數
elevation - 仰角
azimuth - 方位角
5.1.2 設定眼睛與目標點之間的相對關系
WxGLScene.set_posture(elevation=None, azimuth=None, dist=None, save=False)
elevation - 仰角(度)
azimuth - 方位角(度)
dist - 相機位置與目標點位之間的距離
save - 是否保存相機姿態
5.1.3 恢復初始姿態
WxGLScene.reset_posture()
無引數
5.1.4 保存場景為影像檔案
WxGLScene.save_scene(fn, alpha=True, buffer=‘FRONT’)
fn - 保存的檔案名
alpha - 是否使用透明通道
buffer - 顯示緩沖區,默認使用前緩沖區(當前顯示內容)
5.1.5 添加視區
WxGLScene.add_region(box, fixed=False)
box - 四元組,元素值域[0,1],四個元素分別表示視區左下角坐標、寬度、高度
fixed - 是否鎖定旋轉縮放
5.1.6 添加子圖
WxGLScene.add_axes(pos, padding=(20,20,20,20))
pos - 三個數字組成的字串或四元組,表示子圖在場景中的位置和大小
padding - 四元組,上、右、下、左四個方向距離邊緣的留白像素
5.1.7 自動旋轉
WxGLScene.auto_rotate(rotation=‘h+’, **kwds)
rotation - 旋轉模式
'h+' - 水平順時針旋轉(默認方式)
'h-' - 水平逆時針旋轉
'v+' - 垂直前翻旋轉
'v-' - 垂直后翻旋轉
kwds - 關鍵字引數
elevation - 初始仰角,以度(°)為單位,默認值為0
azimuth - 初始方位角以度(°)為單位,默認值為0
step - 幀增量,以度(°)為單位,默認值為5
interval - 幀間隔,以ms為單位,默認值為20
5.1.8 停止旋轉
WxGLScene.stop_rotate()
無引數
5.2 WxGLRegion API
5.2.1 建構式
WxGLRegion.__init__(scene, rid, box, fixed=False)
scene - 所屬場景物件
rid - 唯一標識
box - 四元組,元素值域[0,1],四個元素分別表示視區左下角坐標、寬度、高度
fixed - 是否鎖定旋轉縮放
5.2.2 重置視區
WxGLRegion.reset_box(box, clear=False)
box - 四元組,元素值域[0,1],四個元素分別表示視區左下角坐標、寬度、高度
clear - 是否清空所有模型
5.2.3 設定坐標軸范圍
WxGLRegion.set_data_range(r_x=None, r_y=None, r_z=None)
r_x - 二元組,x坐標軸范圍
r_y - 二元組,y坐標軸范圍
r_z - 二元組,z坐標軸范圍
5.2.4 洗掉模型
WxGLRegion.delete_model(name)
name - 模型名
5.2.5 顯示模型
WxGLRegion.show_model(name)
name - 模型名
5.2.6 隱藏模型
WxGLRegion.hide_model(name)
name - 模型名
5.2.7 更新視區顯示
WxGLRegion.refresh()
無引數
5.2.8 創建紋理物件
WxGLRegion.create_texture(img, alpha=True)
img - 紋理圖片檔案名或資料
alpha - 是否使用透明通道
5.2.9 繪制2D文字
WxGLRegion.text2d(text, size=32, color=None, pos=[0,0,0], **kwds)
text - 文本字串
size - 文字大小,整型
color - 文本顏色
None表示使用場景物件scene的style風格提供的文本顏色
預定義的顏色,或形如'#FF0000'的十六進制表示的顏色
浮點型的元組或串列,值域范圍:[0,1],長度:3
numpy.ndarray型別,shape=(3,)
pos - 文本位置,元組、串列或numpy陣列
kwds - 關鍵字引數
align - 兼容text3d(),并無實際意義
valign - 兼容text3d(),并無實際意義
family - (系統支持的)字體
weight - light/bold/normal分別表示字體的輕、重、正常(默認)
name - 模型名
inside - 是否更新資料動態范圍
visible - 是否顯示
5.2.10 繪制3D文字
WxGLRegion.text3d(text, size=32, color=None, pos=[0,0,0], **kwds)
text - 文本字串
size - 文字大小,整型
color - 文本顏色
None表示使用場景物件scene的style風格提供的文本顏色
預定義的顏色,或形如'#FF0000'的十六進制表示的顏色
浮點型的元組或串列,值域范圍:[0,1],長度:3
numpy.ndarray型別,shape=(3,)
pos - 文本位置,元組、串列或numpy陣列
kwds - 關鍵字引數
align - left/right/center分別表示左對齊、右對齊、居中(默認)
valign - top/bottom/middle分別表示上對齊、下對齊、垂直居中(默認)
family - (系統支持的)字體
weight - light/bold/normal分別表示字體的輕、重、正常(默認)
name - 模型名
inside - 是否更新資料動態范圍
visible - 是否顯示
5.2.11 繪制點
WxGLRegion.point(vs, color, size=None, **kwds)
vs - 頂點坐標集,numpy.ndarray型別,shape=(n,3)
color - 頂點或頂點集顏色
預定義的顏色,或形如'#FF0000'的十六進制表示的顏色
浮點型的元組或串列,值域范圍:[0,1],長度:3
numpy.ndarray型別,shape=(3,)|(4,)|(n,3)|(n,4)
size - 點的大小,整數,None表示使用當前設定
kwds - 關鍵字引數
name - 模型名
inside - 是否更新資料動態范圍
visible - 是否顯示
program - 著色器程式
5.2.12 繪制線段
WxGLRegion.line(vs, color, method=‘SINGLE’, width=None, stipple=None, **kwds)
vs - 頂點坐標集,numpy.ndarray型別,shape=(n,3)
color - 頂點或頂點集顏色
預定義的顏色,或形如'#FF0000'的十六進制表示的顏色
浮點型的元組或串列,值域范圍:[0,1],長度:3
numpy.ndarray型別,shape=(3,)|(4,)|(n,3)|(n,4)
method - 繪制方法
'MULTI' - 線段
'SINGLE' - 連續線段
'LOOP' - 閉合線段
width - 線寬,0.0~10.0之間,None表示使用當前設定
stipple - 線型,整數和兩位元組十六進制整陣列成的元組,形如(1,0xFFFF),None表示使用當前設定
kwds - 關鍵字引數
name - 模型名
inside - 是否更新資料動態范圍
visible - 是否顯示
program - 著色器程式
5.2.13 繪制曲面
WxGLRegion.surface(vs, color=None, texcoord=None, texture=None, method=‘Q’, mode=None, **kwds)
vs - 頂點坐標集,numpy.ndarray型別,shape=(n,3)
color - 頂點或頂點集顏色
None表示僅使用紋理
預定義的顏色,或形如'#FF0000'的十六進制表示的顏色
浮點型的元組或串列,值域范圍:[0,1],長度:3
numpy.ndarray型別,shape=(3|4,)|(n,3|4)
texcoord - 頂點的紋理坐標集,numpy.ndarray型別,shape=(n,2)
texture - 2D紋理物件
method - 繪制方法
'Q' - 四邊形
0--3 4--7
| | | |
1--2 5--6
'T' - 三角形
0--2 3--5
\/ \/
1 4
'Q+' - 邊靠邊的連續四邊形
0--2--4
| | |
1--3--5
'T+' - 邊靠邊的連續三角形
0--2--4
\/_\/_\
1 3 5
'F' - 扇形
'P' - 多邊形
mode - 顯示模式
None - 使用當前設定
'FCBC' - 前后面填充顏色FCBC
'FLBL' - 前后面顯示線條FLBL
'FCBL' - 前面填充顏色,后面顯示線條FCBL
'FLBC' - 前面顯示線條,后面填充顏色FLBC
kwds - 關鍵字引數
name - 模型名
inside - 是否更新資料動態范圍
visible - 是否顯示
program - 著色器程式
light - 材質燈光顏色,None表示關閉材質燈光
5.2.14 繪制網格
WxGLRegion.mesh(xs, ys, zs, color, method=‘Q’, mode=None, **kwds)
xs - 頂點集的x坐標集,numpy.ndarray型別,shape=(rows,cols)
ys - 頂點集的y坐標集,numpy.ndarray型別,shape=(rows,cols)
zs - 頂點集的z坐標集,numpy.ndarray型別,shape=(rows,cols)
color - 頂點或頂點集顏色
預定義的顏色,或形如'#FF0000'的十六進制表示的顏色
浮點型的元組或串列,值域范圍:[0,1],長度:3
numpy.ndarray型別,shape=(3|4,)|(rows,cols,3|4)
method - 繪制方法:
'Q' - 四邊形
'T' - 三角形
mode - 顯示模式
None - 使用當前設定
'FCBC' - 前后面填充顏色FCBC
'FLBL' - 前后面顯示線條FLBL
'FCBL' - 前面填充顏色,后面顯示線條FCBL
'FLBC' - 前面顯示線條,后面填充顏色FLBC
kwds - 關鍵字引數
blc - 邊框的顏色,None表示無邊框
blw - 邊框寬度
name - 模型名
inside - 是否更新資料動態范圍
visible - 是否顯示
program - 著色器程式
light - 材質燈光顏色,None表示關閉材質燈光
5.2.15 繪制球體
WxGLRegion.sphere(center, radius, color, mode=‘FLBL’, slices=60, **kwds)
center - 球心坐標,元組、串列或numpy陣列
radius - 半徑,浮點型
color - 表面顏色
mode - 顯示模式
None - 使用當前設定
'FCBC' - 前后面填充顏色FCBC
'FLBL' - 前后面顯示線條FLBL
'FCBL' - 前面填充顏色,后面顯示線條FCBL
'FLBC' - 前面顯示線條,后面填充顏色FLBC
slices - 錐面分片數(數值越大越精細)
kwds - 關鍵字引數
name - 模型名
inside - 是否更新資料動態范圍
visible - 是否顯示
light - 材質燈光開關
5.2.16 繪制六面體
WxGLRegion.cube(center, side, color, mode=‘FLBL’, **kwds)
center - 中心坐標,元組、串列或numpy陣列
side - 棱長,整型、浮點型,或長度為3的元組、串列、numpy陣列
color - 頂點或頂點集顏色
預定義的顏色,或形如'#FF0000'的十六進制表示的顏色
浮點型的元組或串列,值域范圍:[0,1],長度:3
numpy.ndarray型別,shape=(3|4,)|(rows,cols,3|4)
mode - 顯示模式
None - 使用當前設定
'FCBC' - 前后面填充顏色FCBC
'FLBL' - 前后面顯示線條FLBL
'FCBL' - 前面填充顏色,后面顯示線條FCBL
'FLBC' - 前面顯示線條,后面填充顏色FLBC
kwds - 關鍵字引數
name - 模型名
inside - 是否更新資料動態范圍
visible - 是否顯示
light - 材質燈光開關
5.2.17 繪制圓錐體
WxGLRegion.cone(center, spire, radius, color, slices=50, mode=‘FCBC’, **kwds)
center - 錐底圓心坐標,元組、串列或numpy陣列
spire - 錐尖坐標,元組、串列或numpy陣列
radius - 錐底半徑,浮點型
color - 圓錐顏色
預定義的顏色,或形如'#FF0000'的十六進制表示的顏色
浮點型的元組或串列,值域范圍:[0,1],長度:3
numpy.ndarray型別,shape=(3,)
slices - 錐面分片數(數值越大越精細)
mode - 顯示模式
None - 使用當前設定
'FCBC' - 前后面填充顏色FCBC
'FLBL' - 前后面顯示線條FLBL
'FCBL' - 前面填充顏色,后面顯示線條FCBL
'FLBC' - 前面顯示線條,后面填充顏色FLBC
kwds - 關鍵字引數
name - 模型名
inside - 是否更新資料動態范圍
visible - 是否顯示
light - 材質燈光開關
5.2.18 繪制圓柱體
WxGLRegion.cylinder(v_top, v_bottom, radius, color, slices=50, mode=‘FCBC’, **kwds)
v_top - 圓柱上端面的圓心坐標,元組、串列或numpy陣列
v_bottom - 圓柱下端面的圓心坐標,元組、串列或numpy陣列
radius - 圓柱半徑,浮點型
color - 圓柱顏色
預定義的顏色,或形如'#FF0000'的十六進制表示的顏色
浮點型的元組或串列,值域范圍:[0,1],長度:3
numpy.ndarray型別,shape=(3|4,)|(2,3|4)
slices - 圓柱面分片數(數值越大越精細)
mode - 顯示模式
None - 使用當前設定
'FCBC' - 前后面填充顏色FCBC
'FLBL' - 前后面顯示線條FLBL
'FCBL' - 前面填充顏色,后面顯示線條FCBL
'FLBC' - 前面顯示線條,后面填充顏色FLBC
kwds - 關鍵字引數
headface - 是否顯示圓柱端面
name - 模型名
inside - 是否更新資料動態范圍
visible - 是否顯示
5.2.19 繪制圓管線
WxGLRegion.pipe(vs, radius, color, slices=36, mode=‘FCBC’, **kwds)
vs - 圓管中心點坐標集,numpy.ndarray型別,shape=(n,3)
radius - 圓管半徑,浮點型
color - 圓管顏色
預定義的顏色,或形如'#FF0000'的十六進制表示的顏色
浮點型的元組或串列,值域范圍:[0,1],長度:3
numpy.ndarray型別,shape=(3|4,)|(n,3|4)
slices - 圓管面分片數(數值越大越精細)
mode - 顯示模式
None - 使用當前設定
'FCBC' - 前后面填充顏色FCBC
'FLBL' - 前后面顯示線條FLBL
'FCBL' - 前面填充顏色,后面顯示線條FCBL
'FLBC' - 前面顯示線條,后面填充顏色FLBC
kwds - 關鍵字引數
name - 模型名
inside - 是否更新資料動態范圍
visible - 是否顯示
5.2.20 繪制囊(三維等值面)
WxGLRegion.capsule(data, threshold, color, r_x=None, r_y=None, r_z=None, mode=‘FLBL’, **kwds)
data - 資料集,numpy.ndarray型別,shape=(layers,rows,cols)
threshold - 閾值,浮點型
color - 表面顏色
r_x - x的動態范圍,元組
r_y - y的動態范圍,元組
r_z - z的動態范圍,元組
mode - 顯示模式
None - 使用當前設定
'FCBC' - 前后面填充顏色FCBC
'FLBL' - 前后面顯示線條FLBL
'FCBL' - 前面填充顏色,后面顯示線條FCBL
'FLBC' - 前面顯示線條,后面填充顏色FLBC
kwds - 關鍵字引數
name - 模型名
inside - 是否更新資料動態范圍
visible - 是否顯示
light - 材質燈光開關
5.2.21 繪制體資料
WxGLRegion.volume(data, x=None, y=None, z=None, method=‘Q’, **kwds)
data - 頂點的顏色集,numpy.ndarray型別,shape=(layers,rows,cols,4)
x - 頂點的x坐標集,numpy.ndarray型別,shape=(rows,cols),預設則使用volume的2軸索引構造
y - 頂點的y坐標集,numpy.ndarray型別,shape=(rows,cols),預設則使用volume的1軸索引構造
z - 頂點的z坐標集,numpy.ndarray型別,shape=(layers,),預設則使用volume的0軸索引構造
method - 繪制方法:
'Q' - 四邊形
'T' - 三角形
kwds - 關鍵字引數
name - 模型名
inside - 是否更新資料動態范圍
visible - 是否顯示
5.2.22 繪制坐標軸
WxGLRegion.coordinate(length=1.0, xlabel=None, ylabel=None, zlabel=None, **kwds)
length - 坐標軸半軸長度,從-length到length
xlabel - x軸標注
ylabel - y軸標注
zlabel - z軸標注
kwds - 關鍵字引數
half - 是否畫半軸
slices - 錐面分片數(數值越大越精細)
label_size - 標注文本的字號
name - 模型名
inside - 是否更新資料動態范圍
visible - 是否顯示
5.2.23 繪制colorBar
WxGLRegion.colorbar(drange, cmap, loc=‘right’, **kwds)
drange - 值域范圍,tuple型別
cmap - 調色板名稱
loc - 位置,top|bottom|left|right
kwds - 關鍵字引數
length - ColorBar所在視區的長邊長度,默認短邊長度為1
subject - 標題
subject_size - 標題字號
label_size - 標注字號
label_format - 標注格式化所用lambda函式
tick_line - 刻度線長度
endpoint - 刻度是否包含值域范圍的兩個端點值
name - 模型名
inside - 是否更新資料動態范圍
visible - 是否顯示
5.2.24 繪制網格和刻度
WxGLRegion.ticks(**kwds)
kwds - 關鍵字引數
segment_min - 標注最少分段數量
segment_max - 標注最多分段數量
label_2D3D - 標注試用2D或3D文字
label_size - 標注字號
xlabel_format - x軸標注格式化所用lambda函式
ylabel_format - y軸標注格式化所用lambda函式
zlabel_format - z軸標注格式化所用lambda函式
5.2.25 隱藏刻度網格
WxGLRegion.hide_ticks()
無引數
5.2.26 繪制2D網格和刻度
WxGLRegion.ticks2d(**kwds)
kwds - 關鍵字引數
segment_min - 標注最少分段數量
segment_max - 標注最多分段數量
label_2D3D - 標注試用2D或3D文字
label_size - 標注字號
xlabel_format - x軸標注格式化所用lambda函式
ylabel_format - y軸標注格式化所用lambda函式
5.2.27 繪制流體
WxGLRegion.flow(ps, us, vs, ws, **kwds)
ps - 頂點坐標集,numpy.ndarray型別,shape=(n,3)
us - 頂點u分量集,numpy.ndarray型別,shape=(n,)
vs - 頂點v分量集,numpy.ndarray型別,shape=(n,)
ws - 頂點w分量集,numpy.ndarray型別,shape=(n,)
kwds - 關鍵字引數
color - 軌跡線顏色,None表示使用速度映射顏色
actor - 頂點模型型別,'point'|'line'兩個選項
size - point大小
width - line寬度
length - 軌跡線長度,以速度矢量的模為單位
duty - 頂點line模型長度與軌跡線長度之比(占空比),建議值為0.4
frames - 總幀數
interval - 幀間隔,以ms為單位
threshold - 高通閾值,濾除速度小于閾值的資料點
name - 模型名
5.3 應用示例
代碼部分請從GitHub下載,這里只給出一個界面截圖,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/167245.html
標籤:其他
