Mlab了解
Mlab是Mayavi提供的面向脚本的api,他可以实现快速的三维可视化,Mayavi可以通过Mlab的绘图函数对Numpy数组建立可视化。
过程为:
1.建立数据源 2.使用Filter(可选)对数据进行加工 3.添加可视化模块,我们可以通过修改可视化模块的属性,来修改可视化场景
mgrid和ogrid区别
一:基于Numpy数组的绘图函数
(一)3D绘图函数--Point3d(点图像0维)
这里我们可以看到Point3D参数的描述,是对vtk对象的整体描述,因为Mayavi是对VTK的整体封装,因此Mayavi建立的对象也就是VTK的对象
import numpy as np from mayavi import mlab #建立数据 t = np.linspace(0,4*np.pi,20) #linspace根据起止数据等间距填充数据,分为20组,所以下面将产生20个点 x = np.sin(2*t) y = np.cos(t) z = np.cos(2*t) s = 2 + np.sin(t) #对数据进行可视化 points = mlab.points3d(x,y,z,s,colormap="Reds",scale_factor=.25) mlab.show()
mlab.points3d(x,y,z,s,colormap="Reds",scale_factor=.25) #x,y,z表示Numpy数组,列表或者其他形式的点三维坐标,s表示在该点处的标量值,scale_factor放缩比例
这里:标量值越大,点的尺寸越大,颜色越红
points = mlab.points3d(x,y,z,s,colormap="Greens",scale_factor=.25)
Mayavi.mlab.show建立了简单的GUI,并开始了事件循环,stop用来定义GUI的事件循环是否结束
(二)3D绘图函数--plot3d(线图形一维)
import numpy as np from mayavi import mlab #引入mlab库 #建立数据 n_mer,n_long = 6,11 dphi = np.pi / 1000.0 phi = np.arange(0.0,2*np.pi+0.5*dphi,dphi) mu = phi * n_mer x = np.cos(mu)*(1+np.cos(n_long*mu/n_mer)*0.5) y = np.sin(mu)*(1+np.cos(n_long*mu/n_mer)*0.5) z = np.sin(n_long*mu/n_mer)*0.5 #对数据进行可视化 l = mlab.plot3d(x,y,z,np.sin(mu),tube_radius=0.025,colormap="Spectral") mlab.show()
(三)3D绘图函数--2D数据(二维)
(1)imshow方法
import numpy as np from mayavi import mlab #建立数据 s = np.random.random((10,10)) #二维数据 #对数据进行可视化 img = mlab.imshow(s,colormap="gist_earth") #gist_earth以地球表面的色彩为颜色的颜色映射关系 mlab.show()
(2)surf方法
s:二维数组第一列表示x轴位置,第二列表示y轴位置,x,y可以是一维或者二维数组,一般情况下,他们都由numpy的mgrid或ogrid得到
import numpy as np from mayavi import mlab def f(x,y): return np.sin(x-y)+np.cos(x+y) x,y = np.mgrid[-7.:7.05:0.1,-5.:5.05:0.05] s = mlab.surf(x,y,f) mlab.show()
mgrid返回两个二维数组(个数是不固定的,我们放置几个元素,就会生成几个二维数组) -7.:7.05:0.1---->最小-7,最大7.05,步长为0.1依次生成一个n*n矩阵
>>> x,y = np.mgrid[-7.:7.05:0.1,-5.:5.05:0.05] >>> x array([[-7. , -7. , -7. , ..., -7. , -7. , -7. ], [-6.9, -6.9, -6.9, ..., -6.9, -6.9, -6.9], [-6.8, -6.8, -6.8, ..., -6.8, -6.8, -6.8], ..., [ 6.8, 6.8, 6.8, ..., 6.8, 6.8, 6.8], [ 6.9, 6.9, 6.9, ..., 6.9, 6.9, 6.9], [ 7. , 7. , 7. , ..., 7. , 7. , 7. ]]) >>> y array([[-5. , -4.95, -4.9 , ..., 4.9 , 4.95, 5. ], [-5. , -4.95, -4.9 , ..., 4.9 , 4.95, 5. ], [-5. , -4.95, -4.9 , ..., 4.9 , 4.95, 5. ], ..., [-5. , -4.95, -4.9 , ..., 4.9 , 4.95, 5. ], [-5. , -4.95, -4.9 , ..., 4.9 , 4.95, 5. ], [-5. , -4.95, -4.9 , ..., 4.9 , 4.95, 5. ]])
(3)contour_surf() 与surf()类似,单求解的是等值线,surf求解的是曲面
import numpy as np from mayavi import mlab def f(x,y): return np.sin(x-y)+np.cos(x+y) x,y = np.mgrid[-7.:7.05:0.1,-5.:5.05:0.05] s = mlab.contour_surf(x,y,f) mlab.show()
(四)3D绘图函数--3D数据(三维)
(1)contour3d方法
import numpy as np from mayavi import mlab x,y,z = np.ogrid[-5:5:64j,-5:5:64j,-5:5:64j] #64j表示数组长度为64 scalars = x*x + y*y +z*z obj = mlab.contour3d(scalars,contours=8,transparent=True) #contours八个等值面 transparent该对象可以透明表示,可以查看内部 mlab.show()
ogrid返回3个三维数组(几个是不固定的,我们设置了几个元素,就生成相对应个三维数组)
>>> x,y,z = np.ogrid[-5:5:64j,-5:5:64j,-5:5:64j] >>> x array([[[-5. ]], #共64个元素 [[-4.84126984]], [[-4.68253968]], .......
[[ 4.68253968]], [[ 4.84126984]], [[ 5. ]]])
(2)quiver3d()方法
(x,y,z表示箭头位置,二维即可,不需要三维表示)
import numpy as np
from mayavi import mlab
x,y,z = np.mgrid[-2:3,-2:3,-2:3]
r = np.sqrt(x**2 + y**2 + z**4)
u = y*np.sin(r)/(r+0.001)
v = -x*np.sin(r)/(r+0.001)
w = np.zeros_like(z)
obj = mlab.quiver3d(x,y,z,u,v,w,line_width=3,scale_factor=1)
mlab.show()