文章目录
- Mayavi的官方文档链接在这里。
1 安装
安装1(成功)
Mayavi的pip安装支持不好,所以用编译好的whl文件来安装。安装方法如下,Mayavi及其测试环境为:
# win10系统
# conda 新建的干净环境
# python版本为3.8
# Mayavi版本为4.7.3
安装命令如下:
conda create -n env_name python=3.8
需要按照如下步骤安装以下文件(含版本):
- VTK==8.2
- Mayavi==4.7.3
- PyQt5==5.15.4
其中,由于pip3只有VTK9.0以上的版本,所以先下载whl文件再安装。whl下载自Unofficial Windows Binaries for Python Extension Packages,文件名称为:VTK‑8.2.0‑cp38‑cp38‑win_amd64.whl
。其中cp38
表示python版本为3.8;amd64
代表系统为64位系统。安装命令如下:
# 激活环境
conda activate env_name
# 先安装VTK
pip3 install xxxx路径\VTK‑8.2.0‑cp38‑cp38‑win_amd64.whl
# 通过pip安装mayavi
pip3 install mayavi==4.7.3
# 通过pip安装PyQt5,默认安装了5.15.4的版本,发现是可用的
pip3 install PyQt5
查询到还有一个可视化数据的包叫做menpo,但是没有做过详细查询,先mark在这里。
安装2(失败未解决)
Mayavi的pip安装支持不好,用编译好的whl文件来安装也失败了。所以用以下方法安装Mayavi。测试环境为:
# win10系统
# conda 新建的干净环境
# python版本为3.7(截至20210721,conda下的Mayavi还不支持python3.7医以上的版本)
新建环境命令如下:
# conda 新建的干净环境,python版本为3.8
conda create -n env_name python=3.7
安装Mayavi命令如下:
# 已经查询到当前最高版本为mayavi==4.7.1
conda install mayavi
实际运行中出现报错:
********************************************************************************
WARNING: Imported VTK version (9.0) does not match the one used
to build the TVTK classes (8.2). This may cause problems.
Please rebuild TVTK.
********************************************************************************
未解决!
2 Mayavi的PythonAPI
根据Mayavi的文档,Mayavi的基础PythonAPI有以下这些:
from mayavi import mlab
# 0D and 1D data
mlab.points3d()
mlab.plot3d()
# 2D data
mlab.imshow()
mlab.surf()
mlab.contour_surf()
mlab.mesh()
mlab.barchart()
mlab.triangular()
# 3D data
mlab.contour3d()
mlab.quiver3d()
mlab.flow()
volume_slice()
本文只介绍我实际使用到的几种API函数。
实用API记录
from mayavi import mlab
# 添加坐标轴
mlab.axes(xlabel='x', ylabel='y', zlabel='z')
# 添加外框
p1 = mlab.points3d(x, y, z) # 可以替换成其他图像
mlab.outline(p1)
or
mlab.outline() # 或者直接这样写也行
# 添加颜色标注
mlab.colorbar()
常用属性值如下:
opacity=1.0 # 不透明度,取值范围0-1。0.0表示完全透明,1.0表示完全不透明
color=(1, 1, 1) # RGB数值,每个数的取值范围均为0-1。例:(1, 1, 1)表示白色。
colormap='hot' # 不同的配色方案,可取的值如下:
'''
accent flag hot pubu set2
autumn gist_earth hsv pubugn set3
black-white gist_gray jet puor spectral
blue-red gist_heat oranges purd spring
blues gist_ncar orrd purples summer
bone gist_rainbow paired rdbu winter
brbg gist_stern pastel1 rdgy ylgnbu
bugn gist_yarg pastel2 rdpu ylgn
bupu gnbu pink rdylbu ylorbr
cool gray piyg rdylgn ylorrd
copper greens prgn reds
dark2 greys prism set1
'''
mayavi.mlab.imshow()
- 函数功能:
将一个二维数组以图片的形式展示出来。
- 使用方式:
from mayavi import mlab
img = xxxx # img is a 2D nunmpy array
mlab.imshow(img)
mlab.show(
- 效果展示:
mayavi.mlab.mesh()
- 函数功能:
将物体表面以网格(mesh)的形式展示出来。
- mesh说明:
下图来自千千Sama的文章,直观展示了什么是mesh,原文中有下图gif动画。其中,每个交叉点都是网格点,描述这些网格点的坐标的矩阵,就是坐标矩阵。每个网格点需要x、y、z共3个坐标表示。
但是x、y、z一般都用二维矩阵的形式表示。举个例子:
x = [[0, 1, 2],
[0, 1, 2],
]
y = [[0, 0, 0],
[1, 1, 1],
]
z = [[1, 2, 3],
[4, 5, 6],
]
表示一共有6个点,是一个3 x 2的网格。其中:
x方向有3列:[0, 1, 2]
y方向有2行:[0, 1]
z的数值表示对应位置上的z轴数值。
在Mayavi文档中解释了如何划分连接方式。
- 使用方式:
from mayavi import mlab
# Using numpy array may be better
x = [[0, 1, 2],
[0, 1, 2],
]
y = [[0, 0, 0],
[1, 1, 1],
]
z = [[1, 2, 1],
[-1, -2, -1],
]
mlab.mesh(x, y, z)
mlab.show(
- 效果展示:
- 备注
# 参数:representation = 'wireframe' 可以仅绘制线框。
# 参数:representation = 'surface' 为default值,绘制完整曲面。
mlab.mesh(x, y, z, representation='wireframe', line_width=1.0 )
mayavi.mlab.triangular_mesh()
- 函数功能:
mlab.mesh
函数默认surface是像网格一样连接的,但是面对不规则的surface就没法这样表示了。mlab.triangular_mesh
就是通过三角形来表示surface,从而普适其他情况。
- 使用方式:
from mayavi import mlab
x = [-1, 0, 0, 0, 1]
y = [0, -1, 0, 1, 0]
z = [0, 0, 3, 0, 0]
triangular = [(2, 0, 1), (2, 1, 3), (2, 3, 4), (2, 4, 0)]
mlab.triangular_mesh(x, y, z, triangular)
mlab.axes()
mlab.outline()
mlab.show()
代码解读:
其中,x, y, z
定义了5个点:(-1, 0, 0), (0, -1, 0), (0, 0, 3), (0, 1, 0), (1, 0, 0)
(竖着看xyz的定义那里)。triangular
定义了这些点的连接方式:例如(2, 0, 1)
表示序号(index)为2, 0, 1
的三个点构成一个三角形。
n多个三角形就构成了一整个surface。
- 效果展示:
这篇博客写该函数写的很全面,来自mayavii。
mayavi.mlab.points3d()
- 函数功能:
将三维离散点以球的形式表示出来。
- 使用方式:
参考了大蓝鲸-博客园的文章。
from mayavi import mlab
# Using numpy array may be better
x = [1, 2, 3, 4, 5]
y = [1, 2, 3, 4, 5]
z = [1, 2, 3, 4, 5]
s = [1.5, 4.7, -0.112, -3]
def f(x, y, z):
return x + y - z
mlab.points3d(x, y, z)
or
mlab.points3d(x, y, z, s)
or
mlab.points3d(x, y, z, f)
mlab.show()
- 效果展示:
mayavi.mlab.contour3d()
- 函数功能:
将三维Volumtric数据展示出来。
- 使用方式:
from mayavi import mlab
import numpy as np
img = xxxx # Read in a 3D array
# Usage 1
mlab.contour3d(img)
mlab.show()
# Usage 2
shape_x, shape_y, shape_z = img.shape
x = np.linespace(0, 512, num=shape_x)
y = np.linespace(0, 512, num=shape_y)
z = np.linespace(0, 512, num=shape_z)
x, y, z = np.meshgrid(x, y, z, index='ij')
mlab.contour3d(x, y, z, img)
mlab.show()