文章目录
- 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=x2+y2z = x^2 + y^2z=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 - 画布分辨率,默认800x600kwds - 关键字参数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 - 初始仰角,以度(°)为单位,默认值为0azimuth - 初始方位角以度(°)为单位,默认值为0step - 帧增量,以度(°)为单位,默认值为5interval - 帧间隔,以ms为单位,默认值为20
3.4 数值颜色映射:cmap()
>>> print(plt.cmap.__doc__)数值颜色映射Useage: cmap(data, cm, **kwds)----------------------------------------------------data - 数据cm - 颜色映射表名kwds - 关键字参数invalid - 无效数据的标识invalid_c - 无效数据的颜色datamax - 数据最大值,默认为Nonedatamin - 数据最小值,默认为Nonealpha - 透明度,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__)绘制meshUseage: 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' - 前面显示线条,后面填充颜色FLBCcmap - 颜色映射表,color为None时有效。使用zs映射颜色caxis - 用于颜色映射的坐标轴数据,2D模式下自动转为'y'light - 材质灯光颜色,None表示关闭材质灯光
3.9 绘制surface:surface()
>>> print(plt.surface.__doc__)绘制surfaceUseage: 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' - 前面显示线条,后面填充颜色FLBCtexture - 用于纹理的图像文件,仅当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' - 前面显示线条,后面填充颜色FLBCcmap - 颜色映射表,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' - 前面显示线条,后面填充颜色FLBCkwds - 关键字参数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.4frames - 总帧数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__)绘制colorbarUseage: colorbar(drange, cmap, loc, **kwds)----------------------------------------------------drange - 值域范围,tuple类型cmap - 调色板名称loc - 位置,top|bottom|left|rightkwds - 关键字参数length - ColorBar所在视区的长边长度,默认短边长度为1subject - 标题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°之间生成弧线上的一组点。假设扇面在yozyozyoz平面上,这些点的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)
显然,这是一个50×50的二维网格,x和y的值域范围都是[−2,2][-2,2][−2,2]。分别令网格的每个点的z坐标都是0,以及z=2xe−(x2+y2)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()
因为使用了灯光参数,所以绘制出的球面有亮暗变化,效果如下。
如果将假象的网格视为如下所示的等经纬地图,就可以将这张图映射到球面上。
地图的分辨率是1000×500,因此假象的网格也是1000×500的分辨率。
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层高、水平分辨率是50×50的数据体,每个格点的数据随机生成;然后在其中隐藏一个空心圆椎面,设置圆椎面上的格点值为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 - 初始仰角,以度(°)为单位,默认值为0azimuth - 初始方位角以度(°)为单位,默认值为0step - 帧增量,以度(°)为单位,默认值为5interval - 帧间隔,以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],长度:3numpy.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],长度:3numpy.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],长度:3numpy.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],长度:3numpy.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],长度:3numpy.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],长度:3numpy.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],长度:3numpy.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],长度:3numpy.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],长度:3numpy.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],长度:3numpy.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所在视区的长边长度,默认短边长度为1subject - 标题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.4frames - 总帧数interval - 帧间隔,以ms为单位threshold - 高通阈值,滤除速度小于阈值的数据点name - 模型名
5.3 应用示例
代码部分请从GitHub下载,这里只给出一个界面截图。