Mayavi库的基本元素
Mayavi库中主要有两大部分功能
  一类是用于处理图形可视化和图形操作的mlab模块
  一类是操作管线对象窗口对象的api
mlab包含

  绘图函数:实现已有的数据进行可视化显示,可以是numpy数组构建的,也可以是外部读取的,比如读取一个文件

  图形控制函数:实质上是对mayavi中的figure进行控制,比如可以通过gcf获得当前视图的指针,也可以通过clf来清空当前图形,通过close关闭当前图形
  图形修饰函数:对当前绘制的函数进行一定的修饰和装饰,比如说绘制完图形之后需要增加一个颜色标识栏
  图形控制函数,其他函数和Mlab管线控制函数或者是对坐标轴增加相应的标签等,比如使用xlaber可以在x轴上增加相应的标签
  相机控制函数:对相机的操作,比如说move函数来移动相机到某个位置上,使用pitch,roll,yaw函数控制相机进行旋转等
  其他函数:
    animate:生成一段动态的可视化效果
    get_engine:获得当前管线的engine
  Mlab管线控制:可以设置当前管线的数据源也可以为当前绘制管线增加数据集使用addataset等
Mayavi API
  管线基础对象:可以通过这类函数获得Mayavi管线的各个基本对象
  包括Scene,Source,Filter,ModuleManager,Module,PipelineBase,Engine等
  主视窗和UI对象:用于视图绘制和UI绘制的
    比如MayaviScene,SceneEditor等。我们可以在其他库中构建的用户界面里嵌入Mayavi窗口
    比如可以结合TraitsUI和Mayavi构建一个可交互的三维可视化应用

mayavi的官方网址其中有所有的函数说明地址:
http://docs.enthought.com/mayavi/mayavi/index.html

#快速绘图实例
'''
mayavi跟tvtk相比提供了更方便的可视化功能
通过调用mlab.mash绘制一个三维空间中图形的实例
mayavi中mlab模块提供了方便快捷地绘制三维图发函数
只要把数据准备好,通常只需要调用一次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]]
>>> from mayavi import mlab
>>> s = mlab.mesh(x,y,z)

运行结果:

程序分析:x,y,z数组对应坐标的元素组成了三维坐标点

ash函数的三个数组参数xyz是二维数组,
他们相同下标的三个元素组成了曲面上某点的三维坐标
点之间的连接关系比如边和面由其在x,y,z数组中间的位置关系所决定
由于以上程序所计算的曲面是个旋转体,
曲面上的各个点的坐标是在球面坐标系中计算的
这些信息可以在x,y,z的坐标计算中得到
然后根据坐标转换公式将球面坐标转换成xyz坐标
按住shift键用左键对场景进行拖动平移场景或用shift+键盘键进行拖动
鼠标右键上下拖动或使用+-按键进行场景缩放
按ctrl键+左键拖动可以滚动相机
在程序中,通过传递关键字representation给mash函数可以指定绘制的表现形式
如果默认的,是surface我们可以换成wireframe或points

Mayavi管线的层级
最高层
Engine:建立和销毁场景Scene,并不显示在视图中
Scence场景:每个场景下有多个数据集合Sources,为Mayavi可视化提供了数据
Filter:应用于Scence上对数据进行变换
Module Manager:用来控制颜色,用来表示标量和矢量数据,
在pipline视图中表示为Colors and Legends节点
可视化Modules:用于最终数据的显示,如线条,平面等

#可以通过mlab.show_pipline()或点击左侧的第一个按钮显示mayavi管线的对话框
#点开以后可以看见左侧用树状控件显示的mayavi一系列管线
#为深入了解mayavi管线,我们先注释掉最后一行通过命令行来了解管线中的对象
from numpy import pi,sin,cos,mgrid
from mayavi import mlab
#建立数据
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)
#mlab.show()
'''
管线中的对象scene
Mayavi Scene:处于树的最顶层的对象,表示场景。
其配置界面中可以设置场景的背景,前景色,场景中的灯光及其他一些选项
'''
>>> s = mlab.gcf()#获取对象的背景色(获取当前场景)
>>> print(s)#输出当前的对象状态
<mayavi.core.scene.Scene object at 0x00000009C07DA990>
>>> print(s.scene.background)#输出当前场景的背景色
(0.5, 0.5, 0.5)
>>>
'''
下一级GridSource网格数据源
在配置界面中每一项为每个点所对应的标量数据的名称
在本例中只有一个名为scalars的标量数据,
它是传递给mash的数组,它表示mash表面的每个点的数据
'''
>>> source = s.children[0]#获取GridSource对象
>>> print(repr(source))#返回的字符串是VTKDataSource形式
<mayavi.sources.vtk_data_source.VTKDataSource object at 0x000000F7E93E6E60>
>>> print(source.name)#获取该节点名称
GridSource
>>> print(repr(source.data.points))#GridSource的坐标后面length=多少就是坐标数组大小是多少
[(0.0, 2.0, 0.0), ..., (-0.025048897296365225, -1.9933803751132322, -0.00031479029697865414)], length = 126504
>>> print(repr(source.data.point_data.scalars))#通过print函数打印出每个点对应的标量数组
[0.0, ..., -0.00031479029697865414], length = 126504
>>>
'''
管线中的下一级对象PolydataNormals
PolydataNormals是数据源的法向量
'''
>>> manager = source.children[0]#打印出PolydataNormals的相关信息
>>> print(manager)
<mayavi.filters.poly_data_normals.PolyDataNormals object at 0x000000F7E9F48D58>
>>>
'''
管线中的下一级对象Colors and legends
在colors and legends对象配置页面中
Scalar LUT选项卡可以设置将标量转化为颜色的查询表
例如将LUT_mode改成Blues这样场景中的物体颜色会显示成白色到深蓝色的渐变
如果勾选选项Show legerd选择框在场景中将添加一个颜色条来显示颜色和标量之间的关系
当然,也可以通过程序更改这两个选项
'''
>>> colors = manager.children[0]#获取Colors and legends第一个子节点
>>> colors.scalar_lut_manager.lut_mode = 'Blues'
>>> colors.scalar_lut_manager.show_legend = True
'''
再在管线的下一级看一下surface对象
surface对象将GridSource输出的PolyData数据转换为最终在场景中显示的三维实体
通过它的配置界面Actor选项卡可以对实体进行配置
例如我们将Reprentation设置成wireframe并将Line width设置为0
则实体最终采用细线框来显示
同时我们将opasity设为0.6则实体变为半透明的状态
同样,我们也可以通过命令行的方式来更改这些属性
'''
>>> surface = colors.children[0]#获取colors的第一个子节点
>>> surface.actor.property.representation = 'wireframe'
>>> surface.actor.property.opacity = 0.6
>>> mlab.show()
'''
【总结】
程序配置属性的整个步骤可以描述为
1.获得场景对象,mlab.gcf()
2.通过每个对象的children属性,在管线中找到需要修改的对象
3.当其配置窗口中有多个选项卡的时候,或者有多个配置数组框时,属性需要一级一级获得
在程序配置属性的时候,为了方便配置各种属性的程序,mayavi提供了脚本录制功能
单机视图中的红色圆点,会打开一个脚本对话框
之后的界面配置操作都会被记录到此对话框中
'''
#思考:对比tvtk和mayavi的管线,看看它们之间有什么不同

运行结果:

Python mayavi库及mayavi管线的更多相关文章

  1. 科学计算三维可视化---Mayavi入门(Mayavi库的基本元素和绘图实例)

    一:Mayavi库的基本元素 .处理图形可视化和图形操作的mlab模块 .操作管线对象,窗口对象的api (一)mlab模块 (二)mayavi的api 二:快速绘图实例 (一)mlab.mesh的使 ...

  2. 【Python基础】安装python第三方库

    pip命令行安装(推荐) 打开cmd命令行 安装需要的第三方库如:pip install numpy 在安装python的相关模块和库时,我们一般使用“pip install  模块名”或者“pyth ...

  3. Python可视化库

    转自小小蒲公英原文用Python可视化库 现如今大数据已人尽皆知,但在这个信息大爆炸的时代里,空有海量数据是无实际使用价值,更不要说帮助管理者进行业务决策.那么数据有什么价值呢?用什么样的手段才能把数 ...

  4. 060 Python必备库-从数据处理到人工智能

    目录 一.概述 1.1 从数据处理到人工智能 二.Python库之数据分析 2.1 numpy 2.2 pandas 2.3 scipy 三.Python库之数据可视化 3.1 matplotlib ...

  5. python文件打开模式&time&python第三方库

    r:以只读方式打开文件.文件的指针将会放在文件的开头.这是默认模式. w:打开一个文件只用于写入.如果该文件已存在则将其覆盖.如果该文件不存在,创建新文件. a:打开一个文件用于追加.如果该文件已存在 ...

  6. python+paramiko库+svn写的自动化部署脚本

    第一篇博文 直接开门见山的说了. 这是件什么事?:每次部署都是复制本地的文件粘贴到服务器端,因为路径复杂,所以费时且手工容易出漏洞. 一直在想有什么办法可以解决这种,因为以前在微软的一个牛人同事做过一 ...

  7. 安装Python算法库

    安装Python算法库 主要包括用NumPy和SciPy来处理数据,用Matplotlib来实现数据可视化.为了适应处理大规模数据的需求,python在此基础上开发了Scikit-Learn机器学习算 ...

  8. Python标准库14 数据库 (sqlite3)

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! Python自带一个轻量级的关系型数据库SQLite.这一数据库使用SQL语言.S ...

  9. 常用python机器学习库总结

    开始学习Python,之后渐渐成为我学习工作中的第一辅助脚本语言,虽然开发语言是Java,但平时的很多文本数据处理任务都交给了Python.这些年来,接触和使用了很多Python工具包,特别是在文本处 ...

随机推荐

  1. css,html备忘录

    1.background:url()#000 ;代表当图片不够充满容器时,用黑色填满. 2.height:inherit;继承父级元素的高度. 当子元素给了绝对定位,父元素不给相对定位,子元素也能适配 ...

  2. 解决git中upstream丢失问题Your branch is based on 'origin/xxxx', but the upstream is gone.

    转自 https://blog.csdn.net/limengke123/article/details/77850134

  3. php下kafka实践

    Kafka是一种高吞吐的分布式发布订阅消息系统 kafka安装和简单测试 安装kafka 下载 wget https://www-us.apache.org/dist/kafka/2.1.1/kafk ...

  4. git master 回滚代码

    回退到指定版本 f6a3d430 (为commit id 前8位) git reset --hard f6a3d430 强制推送到远程分支 git push origin HEAD --force 但 ...

  5. winform使用PrintDocument控件打印以及oledb驱动

    代码,需要加入的控件:PrintDocument.PageSetupDialog.PrintDialog.PrintPreviewDialog.BackgroundWorker,控件的Document ...

  6. mysql group by using filesort优化

    原join 连接语句 SELECT SUM(video_flowers.number) AS num, video_flowers.flower_id, flowers.title, flowers. ...

  7. hbase-多租户

    namespace 不同表在不同的namespace,可以做用户的权限控制 资源限制 限制每时间段请求的数量和大小 设置表的空间大小 修改hbase-site.xml文件 添加两个配置 hbase.q ...

  8. 调皮的udp组播技术

    2017年本科毕业,经历过千辛万苦的找工作之后,我进入了现在的这家公司.虽是职场小白,但励志成为IT界的一股清流(毕竟开发的妹子少,哈哈).因为公司的业务需要,我负责的部分是利用组播技术实现OSG模型 ...

  9. PHPEXCEL读出数据是PHPExcel_RichText类型

    今天在做导入EXCEL数据时,而且单元格里的数据类型改成文本类型后,在PHPEXCEL读出来的是PHPExcel_RichText类型的,这类型使getValue()是不管用了,因为这时候getVal ...

  10. 教程:使用cPanel管理域名和数据库

    cPanel是一个基于web的基于web的控制面板,它简化了许多常见的系统管理任务,如网站创建.数据库部署和管理等.本指南向您展示了如何使用cPanel用户帐户管理域和数据库.所有这些指令都与位于端口 ...