Python的3D可视化库【vedo】1-1 (visual模块) 基本可视化选项、添加标度条


vedo是Python实现的一个用于辅助科学研究的3D可视化库。
vedo的visual子模块包含了管理对象及其属性的可视化和外观的基类。

这些类可以单独实例化,但是没有用处。一般是由子类的实例调用它们封装的方法。
这里整理了visual模块的类派生的子类。后面学习这些类时,根据它们的子类的实例来测试这些类的实际效果。

参考:vedo官方文档


1. visual模块的继承关系

visual模块的类都继承自CommonVisual基类,这些派生的子类又是其它模块的类的基类。
下图是和visual模块的类和其他模块之间的继承关系:

image
pointcloud
grids
volume
shapes
mesh
assembly
visual
Image
CellCenters
Points
TetMesh
UnstructuredGrid
RectilinearGrid
StructuredGrid
Volume
many shapes
Text2D
Mesh
assemblyAssembly
PointsVisual
ImageVisual
VolumeVisual
CommonVisual
MeshVisual
Actor2D

2. 基类CommonVisual的方法

CommonVisual封装的可视化相关的函数和属性,可以用来管理所有对象。

这里先创建一个球体和立方体,以此为基础进行后续测试:

import vedo
# 半径为0.7的球体
s = vedo.Sphere(r=0.7)
# 立方体
c = vedo.Cube()
# 使用窗口展示图形,N表示渲染空间的数目,size控制窗口大小
vedo.show([s, c], N=2, size=(800, 300))

在这里插入图片描述
后续使用c来表示CommonVisual类的实例,c.method表示类的方法。

2.1 获取对象信息

2.1.1 对象本身信息

c.print()
打印对象本身

s.print()
c.print()

在这里插入图片描述

2.1.2 对象的查找表

c.LUT
以numpy格式返回对象的查找表。
查找表是VTK中用于将标量和颜色对应的映射表。
会返回一个列表,列表的长度表示设定的颜色数,列表中每个元素是颜色的rgb值和透明度值,范围在[0, 1]

# 含有红、绿、黄3个颜色的LUT值,透明度值都是1(不透明)
[[1. 0. 0. 1.]
 [0. 1. 0. 1.]
 [1. 1. 0. 1.]]

LUT是内部的颜色映射器的数组展示,虽然可以使用数组直接给LUT赋值,但是没有意义。一般在使用cmapbuild_lut时,会在内部自动改写LUT。

2.1.3 对象标量范围

c.scalar_range()
设置或获取对象可视化的标量范围。
LUT一样,可以设置,但是没实用。一般用来获取标量范围,然后据此进行相关操作。

2.1.4 对象缩略图

c.thumbnail()
创建对象的缩略图,并以数组的形式返回。
缩略图相当于展示窗口的截图,返回的数组表示这个截图的每个点的rgb颜色值。
具体参数:

  • zoom=1.25,指定窗口缩放大小。
  • size=(200, 200),指定截图的宽、高像素值。
  • bg='white',指定物体空间的背景颜色。
  • azimuth=0,截图时相机旋转的方位角。
  • elevation=0,截图时相机提升的高度。
  • axes=False,截图是否带坐标系。
// 生成大小为5x5像素的缩略图数组
print(s.thumbnail(size=5, 5))
[[[255 255 255]
  [223 223 223]
  [196 192 193]
  [255 255 255]
  [255 255 255]]
 ...
 [[255 255 255]
  [223 223 223]
  [191 191 191]
  [255 255 255]
  [255 255 255]]]

展示用的原图,和生成的缩略图转为像素图之后的图片:
在这里插入图片描述

2.2 呈现对象

2.2.1 在窗口显示

c.show(**options)
创建一个Plotter类的实例,或者使用现存的最后一个实例来显示单个对象。
这个方法是vedo.plotter.show的快捷方式。如果有超过一个对象需要显示,就得使用show(c1, c2, ..., options)
返回使用的Plotter类的实例。

1.2.2 对象可见性

c.on() 打开对象的可见性。
c.off() 关掉对象的可见性。
c.toggle() 切换对象的可见性。
在这里插入图片描述

2.2.3 对象颜色

c.color()
设置一个颜色,或沿着标度值变化的一组颜色。
参数说明:

  • col,颜色或颜色组;
  • alpha=None,列表,用于指定沿着标量范围变化的透明度;
  • vmin=None,指定标量范围的最小值;
  • vmax=None,指定标量范围的最大值;

目前只有PointsVisual子类继承了这个方法,并且实现时只能直接指定一个颜色和透明度,无法设置颜色组。 在这里插入图片描述

2.2.4 对象透明度

c.alpha(alpha, vmin=None, vmax=None)
沿着标度值范围分配一系列的透明度。

alpha=(0.0, 0.3, 0.9, 1),且标量范围在-10到150时,所有单元格的标量值,在接近-10的都会变透明,在1/4范围处的透明度是0.3,值接近150时不透明。
设置alpha=[(-5, 0), (35, 0.4), (123, 0.9)]时,单元格值低于-5是透明的,高于123时是90%的不透明度。

只有PointsVisual子类和ImageVisual子类继承了这个方法,且只能指定或获取透明度,无法设置渐变的透明度。
在这里插入图片描述

2.3 添加标度条

2.3.1 2D标度条

c.add_scalarbar()
为对象附加一个2D的标度条。2D标度条是画在窗口上的,不会随物体转动。

只有在对象颜色映射器不为空时,才能成功创建2D标度条,表示标量值对应的颜色变化。

具体参数如下:

  • title="",标度条的标题;
  • pos=(0.775, 0.05),标度条左下角的位置坐标。也可以是[0, 1]范围内的一对(x, y)坐标,分别表示左下角和右上角的位置。
  • title_yoffset=15,标题和颜色标度条在垂直方向上的偏移值。
  • size=(80, 400),像素值(宽, 高),表示标量条的尺寸。
  • font_size=12,标题和数值标签使用的字体大小。
  • nlabels=None,数值标签的数目。
  • c=None,标度条文字的颜色。
  • horizontal=False,是否水平放置标量条。
  • use_alpha=True,颜色栏本身的透明度。
  • label_format=':6.3g' 数字标签的格式字符串,C格式。
# 按球体的y坐标的大小设定不同的颜色
s.cmap(["red", "yellow", "green"], s.vertices[:,1])
print(s.LUT)
s.add_scalarbar()
s.show()

输出LUT

[[0.99607843 0.11764706 0.12156863 1.        ]
 [1.         1.         0.21176471 1.        ]
 [0.01568627 0.49803922 0.0627451  1.        ]]

展示图:在这里插入图片描述

2.3.2 3D标度条

c.add_scalarbar3d()
与对象关联一个3D的标度条,并加到场景中。3D标度条可以随物体转动。
可以使用c.scalarbar访问这个标度条。

具体参数如下:

  • title="",标度条的标题;
  • pos=None,参数未说明
  • size=(0, 0),标度条的(厚度, 长度);
  • title_font="",标题字体
  • title_xoffset==-1.2,标题和颜色标度条之间的水平间距;
  • title_yoffset=0.0,标题和颜色标度条之间的垂直间距;
  • title_size=1.5,参数未说明
  • title_rotation=0.0,标题的旋转角度;
  • nlabels=9,数字标签的个数;
  • label_font="",标签的字体;
  • label_size=1,标签的缩放比例;
  • label_offset=0.375,数字标签和刻度之间的间隔;
  • label_rotation=0,标签旋转的角度;
  • label_format="",浮点值和整值标签的格式;
  • italic=0,标签数字斜体;
  • c=None,标签数字颜色;
  • draw_box=True,在颜色条周围绘制边框;
  • above_text=None,参数未说明
  • below_text=None,参数未说明
  • nan_text="NaN",参数未说明
  • categories=None,制作类别标度条,输入列表的格式为[value, color, alpha, textlabel]在这里插入图片描述

2.4 未实装或阉割的功能

2.4.1 鼠标操作性

c.pickable(value=None) 设置或访问对象的可选取性(是否可以被鼠标选择)。
c.draggable(value=None) 设置或访问对象的可拖拽性。

这两个值可以设置和获取成功,但是展示时没有实际效果。

2.4.2 事件

c.add_observer(event_name, func, priority) 添加一个回调函数,事件触发时被调用。
c.invoke_event(event_name) 主动触发事件。

通过add_observer添加事件,绑定回调函数后,可以通过invoke_event触发这个事件。

事件名称可以任意填。但是它会发出警告:事件名称不合法,应该用VTK规定的事件名。
VTK中事件名是根据触发条件起的,如:KeyPress、MouseMove。但是即使填这些名字,在演示的窗口无法通过鼠标和键盘的操作触发事件。

2.4.3 相机设置

c.use_bounds(value=None) 设置当前相机在重置时是否忽略对象边界。
设定这个选项,并变换相机位置后,再使用plotter.reset_camera,在展示窗口无实际效果。


以上是visual模块的继承关系,和基类CommonVisual的方法。

更多关于数据可视化的内容参考:Python数据可视化笔记

ECharts-X是 ECharts 团队推出的全新 3D 可视化,它是基于 ECharts 的扩展,底层深度整合了 WebGL QTEK和 Canvas2D ZRender。特色混搭ECharts 里的混搭功能很强大,作为 ECharts 的扩展,ECharts-X 自然也需要支持。ECharts-X 能跟 ECharts 中的折柱饼地图等图表混搭,可以有更丰富的可视化效果,同时 ECharts-X 也能够直接使用 ECharts 中的 legend, dataRange 等组件。3D大规模标注ECharts-X 中的标注在效果和使用上都跟 ECharts 中的标注(markPoint)类似,但是由于WebGL的强大能力,对于几万甚至几十万的markPoint也能进行实时的动画和交互3D大规模标柱标柱(markBar)是 ECharts-X 中新定义的一个概念,它是标注(markPoint)的衍生,在三维空间扩展了高度维度表达更丰富的数据信息。3D大规模标线同样 ECharts-X 中的标线在使用上和 ECharts 类似,但是展现效果从 2D 变成 3D 的曲线,支持几万 markLine 的实时展现,动画以及交互风场,洋流等向量场的可视化NASA之前发布过全球洋流图,用梵高风格的表现使得可视化也充满了艺术感,ECharts-X 也提供了对洋流,风场这种向量场可视化的便捷配置。同样的,也是实时的展现和交互。自定义底图这个功能比较简单但是非常实用,能够配置地球的底图纹理图片,使得展现更有质感,以后也会在 ECharts 的 map 中加入。下面截图是将地图换成木星纹理的效果。 标签:ECharts
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值