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的互動式繪圖。
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行程式碼,就可以實現下面的效果。
和其他的Python模組一樣,WxGL模組也使用pip命令安裝。
pip install wxgl
WxGL依賴以下模組,如果當前執行環境沒有安裝這些模組,安裝程式將會自動安裝它們。如果安裝過程出現問題,或者安裝完成後無法正常使用,請嘗試手動安裝WxGL的依賴模組。
下面例子中用到的繪圖函數,在本文第3部分「互動式繪圖函數」中均有詳細的使用說明。
>>> 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視窗。
對於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繪圖模式。
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元組引數,用來指定子圖左下角在畫布上的位置,以及子圖的寬度和高度。
和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說明。
只需要提供值域範圍、顏色對映表名字,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的顏色對映表也使用相同的名字
表示多個顏色時,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'}
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'
])
wxplot函數自帶完備的檔案說明,只需要使用__doc__檢視即可。
>>> 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'
>>> print(plt.savefig.__doc__)
儲存畫布為檔案
Useage: savefig(fn, alpha=False)
----------------------------------------------------
fn - 檔名
alpha - 透明通道開關
>>> 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
>>> print(plt.cmap.__doc__)
數值顏色對映
Useage: cmap(data, cm, **kwds)
----------------------------------------------------
data - 資料
cm - 顏色對映表名
kwds - 關鍵字引數
invalid - 無效資料的標識
invalid_c - 無效資料的顏色
datamax - 資料最大值,預設為None
datamin - 資料最小值,預設為None
alpha - 透明度,None表示返回RGB格式
>>> print(plt.subplot.__doc__)
新增子圖
Useage: subplot(pos, padding=(20,20,20,20))
----------------------------------------------------
pos - 子圖在畫布上的位置和大小
三位數位 - 指定分割畫布的行數、列數和子圖序號。例如,223表示兩行兩列的第3個位置
四元組 - 以畫布左下角為原點,寬度和高度都是1。四元組分別表示子圖左下角在畫布上的水平、垂直位置和寬度、高度
padding - 四元組,上、右、下、左四個方向距離邊緣的留白畫素
>>> 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'
>>> 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'
>>> 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表示關閉材質燈光
>>> 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表示關閉材質燈光
>>> 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'
>>> 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
>>> 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
>>> 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
>>> 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
>>> 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 - 是否顯示
>>> 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 - 模型名
>>> 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分別表示字型的輕、重、正常(預設)
>>> 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分別表示字型的輕、重、正常(預設)
>>> 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 - 是否顯示
>>> 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函數
雖然前面給出了很多幾何體的繪製函數,但三維繪圖絕不只是繪製規則的幾何體,而是要表現紛繁複雜的現實的和虛擬的空間。在三維繪圖函數中,最重要、最常用、同時也是最難以理解的是surface()函數和mesh()函數。
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 | 繪製連續四邊形 |
使用原生的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節)。
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位女朋友的照片貼到一個六面體上。不過,多位女朋友照片組成的六面體,只能自己欣賞,不適合送給女朋友哦。你若因此被某位女朋友揍得鼻青臉腫,可別怪我沒有提前警告過你。
mesh()函數也是用來繪製曲面的,它和surface()函數的不同之處在於,mesh()函數的頂點是基於一個假象的二維網格。surface()函數需要傳入一組頂點,mesh()函數則需要分別傳入一組頂點的x、y、z座標,並且對應著假象的二維網格的x、y、z座標。 mesh()函數之所以令人困惑,是因為這個假象的二維網格有時候是真正的資料是重合的。
先生成一個二維網格的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()
左側網格和假象的網格是一致的,右側則是我們真正想要繪製的網格
先生成球面資料。
>>> 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°,從上而下是遞減的,而上面的地圖資料,行號從上而下是遞增的,因此在傳參是需要逆序。最終效果如下圖所示。
先來構造一個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()
如果資料體解析度足夠高,等值面就會足夠光滑。
從網上可以下載到地形地貌資料,這些資料一般包括經度資料集、緯度資料集、高度資料集和地貌資料集。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]。下圖中濟南市北部(下方)的黃河、南部(上方)的群山都清晰可見。
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軸的標註。
WxGL的容器名為WxGLScene,稱為場景。WxGLScene是wx.glcanvas.GLCanvas的派生類,因此WxGL和wxPython的整合是天然無縫的,不存在任何障礙。
每個場景可以使用add_region()生成多個WxGLRegion物件,稱為視區。在視區內可以建立模型,每個模型由一個或多個元件構成——所謂元件,可以理解為子模型。
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 - 方位角
WxGLScene.set_posture(elevation=None, azimuth=None, dist=None, save=False)
elevation - 仰角(度)
azimuth - 方位角(度)
dist - 相機位置與目標點位之間的距離
save - 是否儲存相機姿態
WxGLScene.reset_posture()
無引數
WxGLScene.save_scene(fn, alpha=True, buffer=‘FRONT’)
fn - 儲存的檔名
alpha - 是否使用透明通道
buffer - 顯示緩衝區。預設使用前緩衝區(當前顯示內容)
WxGLScene.add_region(box, fixed=False)
box - 四元組,元素值域[0,1]。四個元素分別表示視區左下角座標、寬度、高度
fixed - 是否鎖定旋轉縮放
WxGLScene.add_axes(pos, padding=(20,20,20,20))
pos - 三個數位組成的字串或四元組,表示子圖在場景中的位置和大小
padding - 四元組,上、右、下、左四個方向距離邊緣的留白畫素
WxGLScene.auto_rotate(rotation=‘h+’, **kwds)
rotation - 旋轉模式
'h+' - 水平順時針旋轉(預設方式)
'h-' - 水平逆時針旋轉
'v+' - 垂直前翻旋轉
'v-' - 垂直後翻旋轉
kwds - 關鍵字引數
elevation - 初始仰角,以度(°)為單位,預設值為0
azimuth - 初始方位角以度(°)為單位,預設值為0
step - 幀增量,以度(°)為單位,預設值為5
interval - 幀間隔,以ms為單位,預設值為20
WxGLScene.stop_rotate()
無引數
WxGLRegion.__init__(scene, rid, box, fixed=False)
scene - 所屬場景物件
rid - 唯一標識
box - 四元組,元素值域[0,1]。四個元素分別表示視區左下角座標、寬度、高度
fixed - 是否鎖定旋轉縮放
WxGLRegion.reset_box(box, clear=False)
box - 四元組,元素值域[0,1]。四個元素分別表示視區左下角座標、寬度、高度
clear - 是否清空所有模型
WxGLRegion.set_data_range(r_x=None, r_y=None, r_z=None)
r_x - 二元組,x座標軸範圍
r_y - 二元組,y座標軸範圍
r_z - 二元組,z座標軸範圍
WxGLRegion.delete_model(name)
name - 模型名
WxGLRegion.show_model(name)
name - 模型名
WxGLRegion.hide_model(name)
name - 模型名
WxGLRegion.refresh()
無引數
WxGLRegion.create_texture(img, alpha=True)
img - 紋理圖片檔名或資料
alpha - 是否使用透明通道
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 - 是否顯示
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 - 是否顯示
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 - 著色器程式
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 - 著色器程式
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表示關閉材質燈光
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表示關閉材質燈光
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 - 材質燈光開關
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 - 材質燈光開關
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 - 材質燈光開關
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 - 是否顯示
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 - 是否顯示
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 - 材質燈光開關
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 - 是否顯示
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 - 是否顯示
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 - 是否顯示
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函數
WxGLRegion.hide_ticks()
無引數
WxGLRegion.ticks2d(**kwds)
kwds - 關鍵字引數
segment_min - 標註最少分段數量
segment_max - 標註最多分段數量
label_2D3D - 標註試用2D或3D文字
label_size - 標註字號
xlabel_format - x軸標註格式化所用lambda函數
ylabel_format - y軸標註格式化所用lambda函數
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 - 模型名
程式碼部分請從GitHub下載,這裡只給出一個介面截圖。