十分鐘玩轉3D繪圖:WxGL完全手冊

天元浪子發表於2020-10-08

文章目錄

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或更高)
  • 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      - 標註試用2D3D文字
                    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下載,這裡只給出一個介面截圖。

在這裡插入圖片描述

相關文章