文章目录

  • 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)

显然,这是一个50x50的二维网格,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()

因为使用了灯光参数,所以绘制出的球面有亮暗变化,效果如下。


如果将假象的网格视为如下所示的等经纬地图,就可以将这张图映射到球面上。


地图的分辨率是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   - 初始仰角,以度(°)为单位,默认值为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下载,这里只给出一个界面截图。

十分钟玩转3D绘图:WxGL完全手册相关推荐

  1. 十分钟玩转 vue3+高德地图AMap+geojson批量绘制Polygon地块数据展示【二、创建地图】

    十分钟玩转 vue3+高德地图AMap+geojson批量绘制Polygon地块数据展示[二.创建地图] 在template标签内创建下列DOM 1.在template标签内,创建container的 ...

  2. 电脑神器软件(二):十分钟玩转potplayer视频播放器

    电脑神器软件(二):十分钟玩转potplayer视频播放器

  3. 十分钟玩转 jQuery+实例大全

    一.简介 定义 jQuery创始人是美国John Resig,是优秀的Javascript框架: jQuery是一个轻量级.快速简洁的javaScript库.源码戳这 jQuery对象 jQuery产 ...

  4. 十分钟玩转 jQuery、实例大全

    一.简介 定义 jQuery创始人是美国John Resig,是优秀的Javascript框架: jQuery是一个轻量级.快速简洁的javaScript库.源码戳这 jQuery对象 jQuery产 ...

  5. 带你十分钟快速入门画图绘图作图神器 Matplotlib_各种画图小结

    20220612 excel也可以画图 20220525 U-net架构(例如最低分辨率为32x32像素).每个蓝框对应一个多通道特征图.通道的数量在方框的顶部表示.x-y尺寸在盒子的左下边缘.白盒代 ...

  6. 虚拟局域网软件开源_玩转虚拟机,十分钟学会一台电脑安装3个操作系统

    玩转虚拟机,十分钟学会一台电脑安装3个操作系统 本文目录 一.什么是虚拟机 1.普通虚拟机 2.Java虚拟机 二.虚拟机的作用 三.虚拟机的安装需求 四.常用的虚拟机软件 1.VMware虚拟机 2 ...

  7. 【Microsoft Azure 的1024种玩法】五十四. 十分钟快速上手创建部署Azure speech服务

    [简介] Azure语音服务是Microsoft提供稳定可靠的云通信服务,其在单个 Azure 订阅中统合了语音转文本.文本转语音以及语音翻译功能,我们可以通过各种方式(语音 CLI.语音 SDK.S ...

  8. 十分钟实现炫酷透明计算器,CSS3+JavaScript实现3D炫酷计算器

    B站视频:https://www.bilibili.com/video/BV1Kp4y167iX 十分钟实现炫酷透明计算器,CSS3+JavaScript实现3D炫酷计算器 今天带大家实现了一个炫酷的 ...

  9. python微信使用教程_小白用Python | 十分钟Python玩微信教程

    原标题:小白用Python | 十分钟Python玩微信教程 代码放在这里:wzyonggege/python-wechat-itchat 词云那里可以换成小黄人图片 ---------------- ...

最新文章

  1. 用MSMTP+MUTT搭建日志邮件发送系统
  2. python科学计算三剑客_《Python数据分析三剑客:Pandas、Numpy、Matplotlib》专题
  3. 性能超强悍 戴尔 R920服务器
  4. 计算机硬件系统一直延用,会计从业资格证考试:会计电算化计算机硬件系统
  5. java 金额_货币金额的计算 - Java中的BigDecimal
  6. 编程语言对比 字面常量
  7. 金属零件图像数据集_如何使用包装零件来开发易于维护的数据仓库解决方案
  8. perl亲身试验ini---使用perl读写配置文件
  9. 机器学习基础(二十八) —— 数据规格化
  10. js 串口通信mscomm接收undefined_VB串口通信应用开发入门知识讲解
  11. Xcode9 无线连接真机调试
  12. mysql存表情出错的解决方案(类似\xF0\x9F\x98\x86\xF0\x9F)
  13. Kubernetes SharedInformerFactory共享Informer机制源码深入剖析-Kubernetes商业环境实战
  14. [java]房屋出租系统
  15. STM32单片机开发板 定制
  16. python 单词纠错_自然语言处理1——语言处理与Python(内含纠错)
  17. c语言写抢QQ红包软件,Android实现QQ抢红包插件
  18. 信息隐藏——扩频水印
  19. Matlab图像处理入门教程(菜鸟级)
  20. greasemonkey_在Firefox中更改或设置Greasemonkey脚本编辑器

热门文章

  1. 计算机幻灯片制作培训方案,教师ppt课件制作活动培训方案..doc
  2. 名悦集团:买新车注意做到这几个不要
  3. [蓝桥杯] 剪邮票 (Python 实现)
  4. 文本相似度的计算-向量空间模型
  5. Subtext分析3-Subtext.Akismet
  6. 服装长尾词有哪些?怎么查询服装的长尾词并导出挖掘结果?
  7. 某煤矿竖井及选煤厂地质研究
  8. php 断点续传,PHP实现断点续传
  9. 文件、合并-如何将多个PPT文件合并到一个PPT中 -by小雨
  10. CSS3:3D变换动画