在PyQt5中使用Mayavi(一):Mayavi简介及安装

这里Mayavi指Mayavi2

前言

我用Python脚本从dyna的d3plot文件中提取了大量的有限元应力数据(以后可能会分享怎么读取,有需要联系我),想在自己开发的程序界面上将应力三维云图绘制出来,面对这个数据量(几十万个点),用matplotlib的话会让程序非常卡顿,然后就有了这个专栏,Mayavi绘制这个还是挺快的,而且交互起来一点不卡。

一、Mayavi简介

Mayavi是一个三维科学数据可视化和绘图库,其具有:

  • 一个丰富的用户界面,可以和数据、对象进行交互。
  • 简洁清晰的Python接口,以及可以使用类似于matlab和matplotlib的3D可视化函数,或者面向对象的交互界面。
  • 底层封装VTK。

与其前身Mayavi1不同,Mayavi2的设计在一开始就考虑了脚本化和可扩展性。Mayavi2提供了直接可用的“mayavi2”应用程序。而它也可以像matplotlib和gnuplot一样作为绘图引擎,或者作为一个交互的可视化库。

二、Mayavi安装

Mayavi有两个非常重要的依赖:

  • VTK 可视化工具箱
  • GUI 图形化界面,PyQt4, PySide, PyQt5 或者 wxPython都是可以的。

如果在64位系统上使用Python 3.x,最简单的方式是使用pip命令进行安装,在目前为止,mayavi最新版为4.8.1。为避免出现各种包冲突问题,最好是在一个新的虚拟环境中安装。

pip install vtk
pip install mayavi
pip install PyQt5

在安装qt时如果卡在Preparing wheel metadata …,可以尝试换个版本安装:

pip install PyQt5==5.12

在上述三个包都安装完毕后,测试一下安装是否成功,运行一下命令:

mayavi2

正常会打开mayavi2的程序界面,如下图所示。
在这里插入图片描述

可以再试着建立一个脚本运行一下官方的一个demo:球谐函数的面绘制。可以看到这里创建数据是用的numpy,Mayavi与numpy的数组良好兼容,这要归功于底层封装的TVTK。

# Create the data.
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)

# View it.
from mayavi import mlab
s = mlab.mesh(x, y, z)
mlab.show()

程序运行后会打开一个scene场景,可以用鼠标和键盘进行交互。
在这里插入图片描述
下一节讲述如何在pyqt5构建的应用程序中置入mayavi的场景。

### 在 PyQt5 中集成 Mayavi 实现数据可视化 为了在 PyQt5 应用程序中集成 Mayavi 进行数据可视化,通常会利用 `traitsui` 和 `mayavi.mlab` 提供的功能来创建嵌入式的三维图形窗口。下面介绍种常见的方式,在 PyQt5 的主界面中加入 Mayavi 可视化组件。 #### 创建 Qt 主应用程序框架并加载 Mayavi 场景 首先定义个继承自 `QWidget` 或者其他合适部件类的新类作为应用的主要容器,并在这个新类里初始化 Mayavi 渲染场景: ```python from pyface.qt import QtGui, QtCore from mayavi.core.ui.api import MlabSceneModel from mayavi.tools.util import get_immediate_subclasses import numpy as np class MainWindow(QtGui.QMainWindow): def __init__(self): super(MainWindow, self).__init__() # 设置中心 widget 并设置布局管理器 central_widget = QtGui.QWidget() layout = QtGui.QVBoxLayout(central_widget) # 添加 Mayavi scene 到 layout container = QtGui.QWidget() layout.addWidget(container) # 初始化 Mayavi Scene Model self.scene = MlabSceneModel() # 构建 Mayavi 图形引擎实例并与当前的 QWidget 关联起来 from tvtk.pyface.ui.qt4.scene_editor import SceneEditor editor = SceneEditor(scene=self.scene) ui = editor.edit_traits(parent=container, kind='subpanel').control layout.addWidget(ui) self.setCentralWidget(central_widget) if __name__ == "__main__": app = QtGui.QApplication.instance() or QtGui.QApplication([]) window = MainWindow() window.show() # 测试绘制些简单的 3D 数据点 x, y, z = np.random.random((3, 10)) window.scene.mlab.points3d(x, y, z) app.exec_() ``` 上述代码展示了如何在个标准的 PyQt5 GUI 程序内引入 Mayavi 绘图功能[^2]。这里的关键在于使用了 `MlabSceneModel()` 来获取个新的 Mayavi 场景区模型对象;接着通过 `tvtk.pyface.ui.qt4.SceneEditor` 类将此模型绑定至特定的小部件上显示出来。 需要注意的是,要使这段代码正常工作,计算机环境中应该已经正确安装好了必要的 Python 包,比如 PyQt5Mayavi、TVTK 等等。如果遇到依赖项缺失的情况,则可能需要按照提示信息调整环境配置或是解决潜在的兼容性问题[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值