python数据可视化 TVTK库的使用

文章目录

      • 一、TVTK简单示例
      • 二、管线技术
      • 三、TVTK数据集
      • 四、TVTK数据读取
      • 五、标量数据可视化
      • 六、矢量数据可视化
      • 七、空间轮廓线可视化

一、TVTK简单示例

以立方体对象为例

  1. 创建一个三维对象
from tvtk.api import tvtk
#设置属性,xyz轴上的长度,还可以设置center(坐标原点)
#output_points_precisio(对象的精度)
s = tvtk.CubeSource(x_length=1.0,y_length=2.0,z_length=3.0)
#查看数据源信息
print(s)

除了CubeSource(立方体三维对象数据源)外,tvtk还自带了ConeSource(圆锥三维对象数据源)、CylinderSource(圆柱三维对象数据源)、ArcSource(圆弧三维对象数据源)、ArrowSource(箭头三维对象数据源)

  1. 显示一个三维对象
#使用PolyDataMapper将数据转换为图形数据
m = tvtk.PolyDataMapper(input_connection=s.output_port)
#创建一个Actor
a = tvtk.Actor(mapper=m)
#创建一个Renderer,将Actor添加进去
r = tvtk.Renderer(background=(0,0,0))
r.add_actor(a)
#创建一个Renderwindow(窗口),将Renderer添加进去
w = tvtk.RenderWindow(size = (300,300))
w.add_renderer(r)
#创建一个RenderwindowInteractor(窗口的交互工具)
i = tvtk.RenderWindowInteractor(render_window = w)
#开启交互
i.initialize()
i.start()

得到结果
python数据可视化 TVTK库的使用_第1张图片

二、管线技术

管线技术(pipeline),在tvtk中可分为两类:可视化管线以及图像管线。

可视化管线:将原始数据加工成图形数据的过程
图像管线:将图形数据加工为图像的过程

图像管线
可视化管线
显示
绘制
数据映射
数据预处理
数据
#可视化管线处理
s = tvtk.CubeSource(x_length=1.0,y_length=2.0,z_length=3.0)
m = tvtk.PolyDataMapper(input_connection=s.output_port)

图像管线

a = tvtk.Actor(mapper=m)
r = tvtk.Renderer(background=(0,0,0))
r.add_actor(a)
w = tvtk.RenderWindow(size = (300,300))
w.add_renderer(r)
i = tvtk.RenderWindowInteractor(render_window = w)
TVTK对象 说明
Actor 场景实体,包括一个mapper,具有描述属性
Renderer 渲染场景,需要多个需要渲染的Actor
RenderWindow 渲染用的图形窗口,需要一个或多个Render
RenderWindowInteractor 提供用户交互功能

三、TVTK数据集

数据集类型 说明
ImageData 二维或三维图像的数据结构 间距均匀的网格 在数组中存储 隐形连接
RectilinearGrid 间距不均匀的网格 点在正交网格上
structuredGrid 任意形状网格 需要指定点的坐标
PolyData 由一系列的点、点之间的联系及由点构成的多边形组成
UnstructuredGrid 无组织网格
  1. ImageData
#origin:数据起始点坐标
#spacing:数据在x、y、z轴上的间距
#dimensions:x、y、z轴上的网格数
img = tvtk.ImageData(spacing=(1,1,1),origin=(1,2,3),dimensions=(3,4,5))

python数据可视化 TVTK库的使用_第2张图片
2. RectilinearGrid

import numpy as np
x = np.array([0,3,9,15])
y = np.array([0,1,5])
z = np.array([0,2,3])
r = tvtk.RectilinearGrid()
r.x_coordinates = x
r.y_coordinates = y
r.z_coordinates = z
r.dimensions = len(x),len(y),len(z)

python数据可视化 TVTK库的使用_第3张图片

四、TVTK数据读取

  1. stl文件读取
from tvtk.api import tvtk
from tvtkfunc import ivtk_scene,event_loop
s = tvtk.STLReader(file_name='xxx.stl')
m = tvtk.PolyDataMapper(input_connection = s.output_port)
a = tvtk.Actor(mapper=m)
win = ivtk_scene(a)
win.scene.isometric_view()
event_loop()
  1. Poly3D,读取MultiBlock类型数据
    分为网格文件(XYZ文件),空气动力学结果(Q文件)以及通用结果文件
from tvtk.api import tvtk
def read_data():
    plot3d = tvtk.MultiBlockPLOT3DReader(
        xyz_file_name = 'combxyz.bin',#网格文件
        q_file_name = 'combq.bin',#空气动力学结果
        scalar_function_number = 100,#标量数据数量
        vector_function_number = 200#矢量数据数量
    )
    plot3d.update()
    return plot3d
plot3d = read_data()
grid = plot3d.output.get_block(0)

#查看数据类型
print(type(plot3d.output))
print(type(grid))
#grid的形状
print(grid.dimensions)
#网格中每个点的坐标
print(grid.points.to_array())
#网格中的单元没有数据
print(grid.cell_data.number_of_arrays)
#点有四种数据
print(grid.point_data.number_of_arrays)
#标量数组的名字
print(grid.point_data.scalars.name)
#矢量数组的名字
print(grid.point_data.vectors.name)

五、标量数据可视化

对上步读取的数据进行可视化,使用等值面对标量场进行可视化。

采用tvtk.ContourFilter()等值面过滤器抽取等值面。

方法 说明
generate_values() 设定n条等值线的值,用以重新绘制等值线
set_value() 设定一条等值线的值,用以覆盖或增加一条等值线
con = tvtk.ContourFilter()
con.set_input_data(grid)
con.generate_values(10,grid.point_data.scalars.range)

m = tvtk.PolyDataMapper(scalar_range=grid.point_data.scalars.range,
                        input_connection = con.output_port)
a = tvtk.Actor(mapper = m)
a.property.opacity = 0.5 #设置Actor透明度
r = tvtk.Renderer(background=(0,0,0))
r.add_actor(a)
w = tvtk.RenderWindow(size = (300,300))
w.add_renderer(r)
i = tvtk.RenderWindowInteractor(render_window = w)
#开启交互
i.initialize()
i.start()

python数据可视化 TVTK库的使用_第4张图片

六、矢量数据可视化

对上步读取的数据进行可视化,对矢量场进行可视化。

采用tvtk.Glyph3D()用箭头表示矢量数据,同时为降低数据密度,使用tvtk.MaskPoints()方法对数据进行降采样。

#矢量数据可视化
#每50个点选择一个点,降低数据密度
mask = tvtk.MaskPoints(random_mode = True,on_ratio = 50)
mask.set_input_data(grid)
#箭头
glyph_source = tvtk.ArrowSource()
#每个点上放置一个箭头,放缩系数为4
glyph = tvtk.Glyph3D(input_connection = mask.output_port,
                    scale_factor = 4)
glyph.set_source_connection(glyph_source.output_port)
m = tvtk.PolyDataMapper(scalar_range=grid.point_data.scalars.range,
                       input_connection = glyph.output_port)
a = tvtk.Actor(mapper = m)
r = tvtk.Renderer(background=(0,0,0))
r.add_actor(a)
w = tvtk.RenderWindow(size = (300,300))
w.add_renderer(r)
i = tvtk.RenderWindowInteractor(render_window = w)
#开启交互
i.initialize()
i.start()

python数据可视化 TVTK库的使用_第5张图片

七、空间轮廓线可视化

采用tvtk.StructuredGridOutlineFilter()计算PolyData对象的外边框

from tvtk.common import configure_input

outline = tvtk.StructuredGridOutlineFilter()
configure_input(outline,grid)
m = tvtk.PolyDataMapper(input_connection = outline.output_port)
a = tvtk.Actor(mapper=m)
a.property.color = 0.3,0.3,0.3
r = tvtk.Renderer(background=(1,1,1))
r.add_actor(a)
#创建一个Renderwindow(窗口),将Renderer添加进去
w = tvtk.RenderWindow(size = (300,300))
w.add_renderer(r)
#创建一个RenderwindowInteractor(窗口的交互工具)
i = tvtk.RenderWindowInteractor(render_window = w)
#开启交互
i.initialize()
i.start()

python数据可视化 TVTK库的使用_第6张图片

#空间轮廓线以及标量结合
from tvtk.common import configure_input
con = tvtk.ContourFilter()
con.set_input_data(grid)
con.generate_values(100,grid.point_data.scalars.range)
m1 = tvtk.PolyDataMapper(scalar_range=grid.point_data.scalars.range,
                        input_connection = con.output_port)
a1 = tvtk.Actor(mapper = m1)
a1.property.opacity = 0.5 #设置Actor透明度

outline = tvtk.StructuredGridOutlineFilter()
configure_input(outline,grid)
m = tvtk.PolyDataMapper(input_connection = outline.output_port)
a = tvtk.Actor(mapper=m)
a.property.color = 0.3,0.3,0.3
r = tvtk.Renderer(background=(1,1,1))
r.add_actor(a)
r1 = tvtk.Renderer(background=(1,1,1))
r1.add_actor(a1)
#创建一个Renderwindow(窗口),将Renderer添加进去
w = tvtk.RenderWindow(size = (300,300))
w.add_renderer(r)
w.add_renderer(r1)
#创建一个RenderwindowInteractor(窗口的交互工具)
i = tvtk.RenderWindowInteractor(render_window = w)
#开启交互
i.initialize()
i.start()

python数据可视化 TVTK库的使用_第7张图片

你可能感兴趣的:(数据可视化,可视化,vtk)