[430]Mayavi 入门

本文深入探讨Mayavi库的基本元素和绘图功能,包括mlab模块的使用,通过实例展示如何利用surf和mesh函数绘制三维曲面,以及如何通过调整参数实现不同的视觉效果。同时,文章还介绍了如何利用Mayavi进行场景交互和管线管理。
摘要由CSDN通过智能技术生成

Mayavi 库基本元素

  • Mayavi.mlab

image.png

  • Mayavi API
    image.png

绘图实例

# -*- 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()

image.png
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()

image.png
为了方便理解mesh函数是如何绘制出曲面的,我们通过手工输入坐标的方式,绘制如下图所示的立方体表面的一部分:
image.png

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()

image.png
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 )

得到如下结果:

image.png

键盘鼠标对场景进行操作

  • 旋转场景:左键拖动或键盘的方向键
  • 平移场景:按住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绘制的洛仑兹吸引子的轨迹:

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函数的例子相同):

imshow函数将二维数组绘制成图像

同样的数据采用contour_surf函数绘制等高线的结果如下图所示:

contour_surf函数绘制二维图像的等高线

参考:https://blog.csdn.net/sinat_27421407/article/details/78989780
http://bigsec.net/b52/scipydoc/mlab_and_mayavi.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

周小董

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值