绘图实例
# -*- 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函数,可以指定绘制的表现形式:
s = mlab.mesh(x, y, z, representation=“wireframe”, line_width=1.0 )
得到如下结果:
下面详细介绍mlab中提供的绘图函数。
绘图语句的程序如下:
mlab.plot3d(track1[:,0], track1[:,1], track1[:,2],color=(1,0,0), tube_radius=0.1)
其中track1为轨迹坐标数组,将其拆分为X,Y,Z轴的三个分量之后,传递给plot3d函数进行绘图。tube_radius指定曲线的粗细,曲线实际上是采用极细的圆管绘制的。
洛仑兹吸引子的轨迹算法请参照: SciPy-数值计算库
同样的数据采用contour_surf函数绘制等高线的结果如下图所示:
参考:https://blog.csdn.net/sinat_27421407/article/details/78989780 http://bigsec.net/b52/scipydoc/mlab_and_mayavi.html