对python mayavi三维绘图的实现详解


Posted in Python onJanuary 08, 2019

网上下载mayavi的官方帮助文档,里面有很多例子,下面的记录都是查看手册后得到的。

http://code.enthought.com/projects/mayavi/docs/development/latex/mayavi/mayavi_user_guide.pdf

python的mayavi.mlab库中的绘图函数有很多候选参数,但下文记录并没有过多讨论,本人也是需要用到才查看手册的。

安装好mayavi2的绘图环境后,可以结合numpy进行科学绘图,在代码中事先加入如下代码:

import mayavi.mlab as mlab
  from numpy import exp,sin,cos,tan,random,mgrid,ogrid,linspace,sqrt,pi
  import numpy as np
  import matplotlib.pyplot as plt
  mlab.figure(fgcolor=(0, 0, 0), bgcolor=(1, 1, 1)) #更改背景色
  #添加matlab的peaks函数
  def peaks(x,y):
    return 3.0*(1.0-x)**2*exp(-(x**2) - (y+1.0)**2) - 10*(x/5.0 - x**3 - y**5) * exp(-x**2-y**2) - 1.0/3.0*exp(-(x+1.0)**2 - y**2)

首先从帮助手册上了解下mayavi的colormap,如下图:

对python mayavi三维绘图的实现详解

下面列举常用的三维绘图函数和简单例子。

一、barchart

* barchart(s, ...)
* barchart(x, y, s, ...)
* barchart(x, y, f, ...)
* barchart(x, y, z, s, ...)
* barchart(x, y, z, f, ...)

如果只传递一个参数,可以是一维(1-D),二维(2-D)或3维(3-D)的给定向量长度的数组;

如果传递三个参数(x,y,s)或(x,y,f),x,y是对应于数组s的二维(2-D)坐标,也可以是可调用的函数f,该函数返回数组;

四个参数的时候(x,y,z)表示三维坐标

s = np.random.rand(3,3)
  mlab.barchart(s)
  mlab.vectorbar()
  mlab.show()

对python mayavi三维绘图的实现详解

x,y = np.mgrid[-5:5:20j,-5:5:20j]
  s = peaks(x,y)   #peaks函数前面已经定义
  mlab.barchart(x,y,s)
  mlab.vectorbar()
  mlab.show()

对python mayavi三维绘图的实现详解

二、contour3d

* contour3d(scalars, ...)
* contour3d(x, y, z, scalars, ...)
* contour3d(x, y, z, f, ...)

scalars是三维数组(3-D),x,y,z用numpy.mgrid生成,是三维数组

x, y, z = ogrid[-5:5:64j, -5:5:64j, -5:5:64j]
  scalars = x * x * 0.5 + y * y + z * z * 2.0
  mlab.contour3d(scalars, contours=6, transparent=True)
  mlab.colorbar()
  mlab.show()

对python mayavi三维绘图的实现详解

三、contour_surf

* contour_surf(s, ...)
* contour_surf(x, y, s, ...)
* contour_surf(x, y, f, ...)

s是二维数组,f是可调用的函数,例如peaks函数

x and y can be 1D or 2D arrays (such as returned by numpy.ogrid or numpy.mgrid)

x,y = np.mgrid[-5:5:70j,-5:5:70j]
  #绘制peaks函数的等高线
  mlab.contour_surf(x,y,peaks,contours=9)
  mlab.colorbar()
  mlab.show()

对python mayavi三维绘图的实现详解

四、imshow

* imshow(s, ...)

s is a 2 dimension array. The values of s are mapped to a color using the colormap.

  s = np.random.rand(3,3) #生成随机的3×3数组
  mlab.imshow(s)
  mlab.colorbar()
  mlab.show()

对python mayavi三维绘图的实现详解

五、mesh

* mesh(x, y, z, ...)

x, y, z are 2D arrays, all of the same shape, giving the positions of the vertices of the surface.

x , y , z 都是二维数组,拥有相同的shape,而且z代表了平面坐标(x,y)对应下的值,下面绘制的是matlab的peaks函数三维图,可能是因为绘图比例的原因看起来并没有matlab下绘制的好看

y,x = np.mgrid[-5:5:70j,-5:5:70j]
  z=peaks(x,y)
  mlab.mesh(x,y,z)
  mlab.colorbar()
  mlab.show()

对python mayavi三维绘图的实现详解

六、surf

* surf(s, ...)
* surf(x, y, s, ...)
* surf(x, y, f, ...)

x , y可以是1-D或者2-D的数组(比如numpy.ogrid或numpy.mgrid返回的数组)

如果只传递了参数数组s,那么x,y就被认为是数组s的索引值,并且创建等宽的数据集。(If only 1 array s is passed, the x and y arrays are assumed to be made from the indices of arrays, and an uniformly-spaced data set is created.)

surf和mesh的不同之处在于surf的参数x,y可以是一维(1-D)的。

mlab.clf()
  x, y = mgrid[-10:10:100j, -10:10:100j]
  r = sqrt(x**2 + y**2)
  z = sin(r)/r
  # mlab.surf(x,y,z,wrap_scale='auto')
  mlab.surf(z, warp_scale='auto')
  mlab.colorbar()
  mlab.show()

对python mayavi三维绘图的实现详解

surf函数同样可以绘制peaks曲面,

pk_y,pk_x = np.mgrid[-5:5:70j,-5:5:70j]
  pk_z=peaks(pk_x,pk_y)
  mlab.surf(pk_z,warp_scale='auto',colormap='jet')
  mlab.colorbar()
  mlab.show()

这里只传递了一个参数pk_z,

对python mayavi三维绘图的实现详解

七、plot3d

* plot3d(x, y, z, ...)
* plot3d(x, y, z, s, ...)

数据点之间绘制线段,x,y,z,s都是具有相同shape的numpy数组或列表(list),x,y,z是三维坐标,也就是空间中数据点的位置

t=mgrid[-pi:pi:100j]
  mlab.plot3d(cos(t),sin(3*t),cos(5*t),color=(0.23,0.6,1),colormap='Spectral')
  mlab.colorbar()
  mlab.show()

对python mayavi三维绘图的实现详解

八、points3d

* points3d(x, y, z...)
* points3d(x, y, z, s, ...)
* points3d(x, y, z, f, ...)

和前面的plot3d差不多,只不过points3d只绘制三维坐标下的点(x,y,z),仍然用前面的例子。

t=mgrid[-pi:pi:50j]
  s=sin(t)
  # 参数s是设置每个点的大小(scalar),mode可选
  mlab.points3d(cos(t),sin(3*t),cos(5*t),s,mode='sphere',line_width=1)
  mlab.colorbar()
  mlab.show()

对python mayavi三维绘图的实现详解

参数的mode可选项如下图:

对python mayavi三维绘图的实现详解

九、quiver3d

* quiver3d(u, v, w, ...)
* quiver3d(x, y, z, u, v, w, ...)
* quiver3d(x, y, z, f, ...)

x,y,z=mgrid[-0:3:0.6,-0:3:0.6,0:3:0.3]
  r=sqrt(x**2+y**2+z**4)
  u=y*sin(r)/(r+0.001)
  v=-x*sin(r)/(r+0.001)
  w=zeros_like(r)
  mlab.quiver3d(x,y,z,u,v,w)
  mlab.colorbar()
  mlab.show()

对python mayavi三维绘图的实现详解

十、animate

绘制三维动图,帮助文档上的代码执行后并没有动画效果,下面2个示例代码是查看了mayavi的相关源码后总结的,大家也可以直接查看相关源码查看更多官方提供的示例代码。

(1)

@animate(delay=200) # 设置延时时间200ms
  def anim():
    n_mer, n_long = 6, 11
    pi = numpy.pi
    dphi = pi/1000.0
    phi = numpy.arange(0.0, 2 * pi + 0.5 * dphi, dphi, 'd')
    mu = phi * n_mer
    x = numpy.cos(mu) * (1+numpy.cos(n_long * mu/n_mer) * 0.5)
    y = numpy.sin(mu) * (1+numpy.cos(n_long * mu/n_mer) * 0.5)
    z = numpy.sin(n_long * mu/n_mer) * 0.5
    l = plot3d(x, y, z, numpy.sin(mu), tube_radius=0.025, colormap='Spectral')
    ms = l.mlab_source
    for i in range(100):
      x = numpy.cos(mu) * (1+numpy.cos(n_long * mu/n_mer + numpy.pi * (i+1)/5.) * 0.5)
      scalars = numpy.sin(mu + numpy.pi * (i+1)/5)
      #不改变shape和size的情况下用set来更改属性值
        ms.set(x=x, scalars=scalars)  
      yield
  anim()
  show()

(2)

@animate #默认500ms延时
  def anim2():
    x, y = np.mgrid[0:3:1,0:3:1]
    s = mlab.surf(x, y, np.asarray(x*0.1, 'd'),representation='wireframe')
    fig = mlab.gcf()
    ms = s.mlab_source
    for i in range(15):
      x, y = np.mgrid[0:3:1.0/(i+2),0:3:1.0/(i+2)]
      sc = np.asarray(x*x*0.05*(i+1), 'd')
      ms.reset(x=x, y=y, scalars=sc)
      fig.scene.reset_zoom()
      yield
  anim2()
  show()

以上这篇对python mayavi三维绘图的实现详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python实现文件复制删除
Apr 19 Python
Python+OpenCV实现图像融合的原理及代码
Dec 03 Python
flask-restful使用总结
Dec 04 Python
详解python持久化文件读写
Apr 06 Python
python2与python3爬虫中get与post对比解析
Sep 18 Python
Python超越函数积分运算以及绘图实现代码
Nov 20 Python
pandas中read_csv的缺失值处理方式
Dec 19 Python
Python安装依赖(包)模块方法详解
Feb 14 Python
史上最详细的Python打包成exe文件教程
Jan 17 Python
Python max函数中key的用法及原理解析
Jun 26 Python
python实现层次聚类的方法
Nov 01 Python
分享提高 Python 代码的可读性的技巧
Mar 03 Python
利用python和ffmpeg 批量将其他图片转换为.yuv格式的方法
Jan 08 #Python
python+opencv打开摄像头,保存视频、拍照功能的实现方法
Jan 08 #Python
Python OpenCV对本地视频文件进行分帧保存的实例
Jan 08 #Python
python-opencv 将连续图片写成视频格式的方法
Jan 08 #Python
对Python+opencv将图片生成视频的实例详解
Jan 08 #Python
Python中的heapq模块源码详析
Jan 08 #Python
python使用PIL模块获取图片像素点的方法
Jan 08 #Python
You might like
使用PHPMyAdmin修复论坛数据库的图文方法
2012/01/09 PHP
Session 失效的原因汇总及解决丢失办法
2015/09/30 PHP
PHP对象链式操作实现原理分析
2016/10/09 PHP
JavaScript 对象、函数和继承
2009/07/07 Javascript
JavaScript入门之事件、cookie、定时等
2011/10/21 Javascript
javascript获取form里的表单元素的示例代码
2014/02/14 Javascript
js创建一个input数组并绑定click事件的方法
2014/06/12 Javascript
js实现iframe自动自适应高度的方法
2015/02/17 Javascript
jQuery实现的手机发送验证码倒计时效果代码分享
2015/08/24 Javascript
轻松学习jQuery插件EasyUI EasyUI表单验证
2015/12/01 Javascript
Javascript字符串常用方法详解
2016/07/21 Javascript
详解Javascript ES6中的箭头函数(Arrow Functions)
2016/08/24 Javascript
javascript+html5+css3自定义提示窗口
2017/06/21 Javascript
基于jquery实现多级菜单效果
2017/07/25 jQuery
thinkjs微信中控之微信鉴权登陆的实现代码
2019/08/08 Javascript
阿望教你用vue写扫雷小游戏
2020/01/20 Javascript
vue下拉刷新组件的开发及slot的使用详解
2020/12/23 Vue.js
使用Python抓取模板之家的CSS模板
2015/03/16 Python
Python3调用微信企业号API发送文本消息代码示例
2017/11/10 Python
python3安装speech语音模块的方法
2018/12/24 Python
python使用Qt界面以及逻辑实现方法
2019/07/10 Python
Jupyter notebook设置背景主题,字体大小及自动补全代码的操作
2020/04/13 Python
python3.6环境下安装freetype库和基本使用方法(推荐)
2020/05/10 Python
HTML5新增的8类INPUT输入类型介绍
2015/07/06 HTML / CSS
文职个人求职信范文
2013/09/23 职场文书
人事专员工作职责
2014/02/22 职场文书
土地转让协议书范本
2014/04/15 职场文书
我的理想演讲稿
2014/04/30 职场文书
贷款担保申请书
2014/05/20 职场文书
官僚主义现象查摆问题整改措施
2014/10/04 职场文书
2014年加油站工作总结
2014/12/04 职场文书
幼儿园毕业致辞
2015/07/29 职场文书
Python 使用dict实现switch的操作
2021/04/07 Python
Python代码风格与编程习惯重要吗?
2021/06/03 Python
python 标准库原理与用法详解之os.path篇
2021/10/24 Python
vue的项目如何打包上线
2022/04/13 Vue.js