Mayavi 库基本元素
- Mayavi.mlab
- Mayavi API
绘图实例
# -*- coding:utf-8 -*-
import numpy as np
from mayavi import mlab
import matplotlib.pyplot as plt
x, y = np.ogrid[-2:2:20j, -2:2:20j]
z = x * np.exp( - x**2 - y**2)
pl = mlab.surf(x, y, z, warp_scale="auto")
mlab.axes(xlabel='x', ylabel='y', zlabel='z')
mlab.outline(pl)
mlab.show()
mlab.surf绘制一个三维空间中的曲面。曲面上的每个点的坐标由surf函数的三个二维数组参数x,y,z给出。由于数组x,y是由ogrid对象算出,它们分别是shape为n*1和1*n的数组,而z是一个n*n的数组。
通过调用mlab.axes和mlab.outline函数,分别在三维空间中添加坐标轴,和曲面区域的外框。
surf绘制的曲面在X-Y平面上的投影是一个等距离的网格,如果需要绘制更复杂的三维曲面的话,可以使用mesh函数。
from mayavi import mlab
x = [[-1, 1, 1, -1, -1], [-1, 1, 1, -1, -1]]
y = [[-1, -1, -1, -1, -1], [1, 1, 1, 1, 1]]
z = [[1, 1, -1, -1, 1], [1, 1, -1, -1, 1]]
s = mlab.mesh(x, y, z)
mlab.show()
为了方便理解mesh函数是如何绘制出曲面的,我们通过手工输入坐标的方式,绘制如下图所示的立方体表面的一部分:
x,y,z数组的定义如下:
x = [[-1,1,1,-1,-1],
[-1,1,1,-1,-1]]
y = [[-1,-1,-1,-1,-1],
[1,1,1,1, 1]]
z = [[1,1,-1,-1,1],
[1,1,-1,-1,1]]
x, y, z数组对应坐标的元素组成三维坐标点,因此这三个数组实际描述的坐标点为:
[
[(-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)
构成一个mesh中的一个面。依次类推,第二个面由:
(1,-1,1),(1,-1,-1),(1,1,1),(1,1,-1)
构成,一共定义有4个面。
from mayavi import mlab
from numpy import pi, sin, cos, mgrid
dphi, dtheta = pi/250.0, pi/250.0
[phi, theta] = mgrid[0:pi+dphi*1.5:dphi, 0:2*pi+dtheta*1.5:dtheta]
m0 = 4; m1 = 3; m2 = 2; m3 = 3; m4 = 6; m5 = 2; m6 = 6; m7 = 4;
r = sin(m0*phi)**m1 + cos(m2*phi)**m3 + sin(m4*theta)**m5 + cos(m6*theta)**m7
x = r*sin(phi)*cos(theta)
y = r*cos(phi)
z = r*sin(phi)*sin(theta)
s = mlab.mesh(x, y, z, line_width=1.0)#,representation="wireframe"
mlab.show()
mesh和surf类似,其三个数组参数x, y, z也是二维数组,他们相同下标的三个元素组成曲面上某点的三维坐标。点之间的连接关系(边和面)由其在x,y,z数组中间的位置关系决定。
由于这个程序所计算的曲面是一个旋转体,曲面上的各个点的坐标是在球面坐标系中计算的,然后按照坐标转换公式将球面坐标转换为X-Y-Z坐标。
通过传递一个关键字参数representation给mesh函数,可以指定绘制的表现形式:
- surface : 缺省值,绘制曲面
- wireframe : 绘制边线,将dphi, dtheta的改为较大值,例如pi/20之后,调用 :
s = mlab.mesh(x, y, z, representation=“wireframe”, line_width=1.0 )
得到如下结果:
键盘鼠标对场景进行操作
- 旋转场景:左键拖动或键盘的方向键
- 平移场景:按住Shift键并使用左键拖动,或shift+方向键盘
- 缩放场景:鼠标右键上下拖动或使用“ +” 和“ -”按键
- 滚动相机:按住CTRL键并用左键拖动
- 工具栏:从坐标轴6个方向观察场景、等角投影、切换平行透视和成角透视等
Mayavi 管线
- Engine:建立和销毁Scenes
- Scenes:多个数据集合Sources
- Filters:对数据进行变换
- Module Manager:控制颜色,Colors and Legends
- Modules:最终数据的表示,如线条、平面等
下面详细介绍mlab中提供的绘图函数。
- points3d, plot3d : 给它们传递的3个坐标数组x,y,z都是一维的,因此这两个函数绘制出来的是三维空间中的一系列点(points3d),或者是一条曲线(plot3d)。下图是采用plot3d绘制的洛仑兹吸引子的轨迹:
绘图语句的程序如下:
mlab.plot3d(track1[:,0], track1[:,1], track1[:,2],color=(1,0,0), tube_radius=0.1)
其中track1为轨迹坐标数组,将其拆分为X,Y,Z轴的三个分量之后,传递给plot3d函数进行绘图。tube_radius指定曲线的粗细,曲线实际上是采用极细的圆管绘制的。
洛仑兹吸引子的轨迹算法请参照: SciPy-数值计算库
- imshow, surf, contour_surf : 这三个函数都可以接收一个二维数组s,以其第一轴的下标为X轴坐标,第二轴的下标为Y轴坐标。imshow函数将此二维数组当作一个图片显示,每点的颜色为数组s的每个元素的值。surf函数则将此二维数组绘制成三维空间中的曲面,数组中每个元素的值为点的Z轴坐标。contour_surf则绘制二维数组的等高线。下面是imshow函数的绘制结果(所使用的数组和前面surf函数的例子相同):
同样的数据采用contour_surf函数绘制等高线的结果如下图所示:
参考:https://blog.csdn.net/sinat_27421407/article/details/78989780
http://bigsec.net/b52/scipydoc/mlab_and_mayavi.html