对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搭建微信公众平台
Feb 16 Python
Ruby使用eventmachine为HTTP服务器添加文件下载功能
Apr 20 Python
python3新特性函数注释Function Annotations用法分析
Jul 28 Python
python虚拟环境virtualenv的安装与使用
Sep 21 Python
python GUI实例学习
Nov 21 Python
python实现随机森林random forest的原理及方法
Dec 21 Python
pandas 快速处理 date_time 日期格式方法
Nov 12 Python
python2与python3的print及字符串格式化小结
Nov 30 Python
解决python执行不输出系统命令弹框的问题
Jun 24 Python
Django的models中on_delete参数详解
Jul 16 Python
详解Python 字符串相似性的几种度量方法
Aug 29 Python
Python: glob匹配文件的操作
Dec 11 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
新版PHP将向Java靠拢
2006/10/09 PHP
php表单转换textarea换行符的方法
2010/09/10 PHP
php中获取主机名、协议及IP地址的方法
2014/11/18 PHP
PHP获取一年中每个星期的开始和结束日期的方法
2015/02/12 PHP
php关闭warning问题的解决方法
2016/05/17 PHP
php设计模式之策略模式应用案例详解
2019/06/17 PHP
ThinkPHP5.0框架实现切换数据库的方法分析
2019/10/30 PHP
一个可以兼容IE FF的加为首页与加入收藏实现代码
2009/11/02 Javascript
初识angular框架后的所思所想
2016/02/19 Javascript
Bootstrap弹出带合法性检查的登录框实例代码【推荐】
2016/06/23 Javascript
javascript实现图片左右滚动效果【可自动滚动,有左右按钮】
2016/09/19 Javascript
JavaScript取得gridview中获取checkbox选中的值
2017/07/24 Javascript
Bootstrap Tooltip显示换行和左对齐的解决方案
2017/10/11 Javascript
详谈js中标准for循环与foreach(for in)的区别
2017/11/02 Javascript
完美解决手机网页中输入框被输入法遮挡的问题
2017/12/19 Javascript
24个ES6方法解决JS实际开发问题(小结)
2020/05/31 Javascript
详解实现vue的数据响应式原理
2021/01/20 Vue.js
Python笔记(叁)继续学习
2012/10/24 Python
利用anaconda保证64位和32位的python共存
2021/03/09 Python
Python数据类型之列表和元组的方法实例详解
2019/07/08 Python
解析python的局部变量和全局变量
2019/08/15 Python
python实现提取COCO,VOC数据集中特定的类
2020/03/10 Python
python入门:argparse浅析 nargs='+'作用
2020/07/12 Python
解决python运行效率不高的问题
2020/07/20 Python
python如何设置静态变量
2020/09/07 Python
艺术家策划的室内设计:Curious Egg
2019/03/06 全球购物
美术专业学生个人自我评价
2013/09/19 职场文书
给全校老师的建议书
2014/03/13 职场文书
体育运动口号
2014/06/09 职场文书
2014年入党积极分子党校培训心得体会
2014/07/08 职场文书
环保证明
2015/06/23 职场文书
校园新闻稿范文
2015/07/18 职场文书
《七月的天山》教学反思
2016/02/19 职场文书
Python 线程池模块之多线程操作代码
2021/05/20 Python
SQL Server数据库查询出现阻塞之性能调优
2022/04/10 SQL Server
maven 解包依赖项中的文件的解决方法
2022/07/15 Java/Android