前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Mayavi 入门

Mayavi 入门

作者头像
周小董
发布2019-03-25 11:01:50
1.9K0
发布2019-03-25 11:01:50
举报
文章被收录于专栏:python前行者python前行者

Mayavi 库基本元素

  • Mayavi.mlab
image.png
image.png
  • Mayavi API
image.png
image.png

绘图实例

代码语言:javascript
复制
# -*- 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
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函数。

代码语言:javascript
复制
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
image.png

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

image.png
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个面。

代码语言:javascript
复制
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
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
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函数绘制的洛仑兹吸引子,曲线使用很细的圆管绘制
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函数将二维数组绘制成图像
imshow函数将二维数组绘制成图像

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

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

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018年11月13日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Mayavi 库基本元素
  • 键盘鼠标对场景进行操作
  • Mayavi 管线
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档