目录
技术背景
三维可视化是一项在工业领域中非常重要的技术,而Python中最热门的可视化工具matplotlib和plotly,更加倾向于在数据领域的可视化,用于展现数据的结果。类似的还有百度的pyechart也相对美观,但是这些毕竟都是在数据层面的可视化,对于工业领域,比如一个地形,一个三维的期间等等,用这些工具来做可视化效果非常的不佳,因此我找到了pyvista这个工具,简单摸索了一下给大家做个引荐。
安装pyvista
因为pyvista及其依赖都是一些python库,这就使得我们可以用pip直接简单的安装,这里放几个可能用到的依赖的安装流程:
(base) dechin@ubuntu2004:~/projects$ python3 -m pip install vtk==9.0.20210612.dev0Collecting vtk==9.0.20210612.dev0 Downloading vtk-9.0.20210612.dev0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (80.9 MB) |████████████████████████████████| 80.9 MB 3.7 MB/s Requirement already satisfied: wslink>=0.1.3 in /home/dechin/anaconda3/lib/python3.8/site-packages (from vtk==9.0.20210612.dev0) (0.2.0)Installing collected packages: vtk Attempting uninstall: vtk Found existing installation: vtk 9.0.2 Uninstalling vtk-9.0.2: Successfully uninstalled vtk-9.0.2Successfully installed vtk-9.0.20210612.dev0
安装pyvista的时候最好加上一个国内的镜像源,否则有可能出现 络问题,其他的包不需要加镜像源:
(base) dechin@ubuntu2004:~/projects$ python3 -m pip install pyvista --trusted-host https://repo.huaweicloud.com -i https://repo.huaweicloud.com/repository/pypi/simpleLooking in indexes: https://repo.huaweicloud.com/repository/pypi/simpleCollecting pyvista Downloading https://repo.huaweicloud.com/repository/pypi/packages/ec/00/292dc2f14247d74098806dcb9e1bb0c416b936c145ca9ab4e940b6f90d4f/pyvista-0.31.3-py3-none-any.whl (1.3 MB) |████████████████████████████████| 1.3 MB 2.7 MB/s Requirement already satisfied: imageio in /home/dechin/anaconda3/lib/python3.8/site-packages (from pyvista) (2.9.0)Requirement already satisfied: numpy in /home/dechin/anaconda3/lib/python3.8/site-packages (from pyvista) (1.20.2)Requirement already satisfied: pillow in /home/dechin/anaconda3/lib/python3.8/site-packages (from pyvista) (8.2.0)Collecting scooby>=0.5.1 Downloading https://repo.huaweicloud.com/repository/pypi/packages/1b/99/db6d34bdc3f060d631f524c2f0fc4b1919cd3bf734c905fc1b25eb847ac2/scooby-0.5.7-py3-none-any.whl (13 kB)Collecting transforms3d==0.3.1 Downloading https://repo.huaweicloud.com/repository/pypi/packages/b5/f7/e85809168a548a854d7c1331560c27b4f5381698d29c12e57759192b2bc1/transforms3d-0.3.1.tar.gz (62 kB) |████████████████████████████████| 62 kB 2.2 MB/s Requirement already satisfied: vtk in /home/dechin/anaconda3/lib/python3.8/site-packages (from pyvista) (9.0.20210612.dev0)Requirement already satisfied: appdirs in /home/dechin/anaconda3/lib/python3.8/site-packages (from pyvista) (1.4.4)Collecting meshio<5.0,>=4.0.3 Downloading https://repo.huaweicloud.com/repository/pypi/packages/bb/36/02702cfc5fdf19e6477ea2a78cac4a774a8da4c2cf9557f3ddfb33c74192/meshio-4.4.6-py3-none-any.whl (158 kB) |████████████████████████████████| 158 kB 2.7 MB/s Building wheels for collected packages: transforms3d Building wheel for transforms3d (setup.py) ... done Created wheel for transforms3d: filename=transforms3d-0.3.1-py3-none-any.whl size=59373 sha256=56293f06c7932f3c12d57476773220d4219d8a978257f84bf56f4a8be8cccb2b Stored in directory: /home/dechin/.cache/pip/wheels/45/80/2d/22eb03277c315a020a6fdb617cc1232ef4ddc04dc2f00b8a22Successfully built transforms3dInstalling collected packages: transforms3d, scooby, meshio, pyvistaSuccessfully installed meshio-4.4.6 pyvista-0.31.3 scooby-0.5.7 transforms3d-0.3.1
另外还有这个三维可交互面板绘制的插件:
(base) dechin@ubuntu2004:~/projects$ python3 -m pip install ipyganyCollecting ipygany Using cached ipygany-0.5.0-py2.py3-none-any.whl (2.9 MB)Requirement already satisfied: numpy in /home/dechin/anaconda3/lib/python3.8/site-packages (from ipygany) (1.20.2)Requirement already satisfied: pyparsing>=2.0.2 in /home/dechin/.local/lib/python3.8/site-packages (from packaging->bleach->nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets>=7.6.0->ipygany) (2.4.7)Installing collected packages: ipyganySuccessfully installed ipygany-0.5.0
以及一个基于pyqt的一个弹出式绘图插件:
(base) dechin@ubuntu2004:~/projects$ python3 -m pip install pyvistaqtCollecting pyvistaqt Downloading pyvistaqt-0.5.0-py3-none-any.whl (162 kB) |████████████████████████████████| 162 kB 1.1 MB/s Requirement already satisfied: QtPy>=1.9.0 in /home/dechin/anaconda3/lib/python3.8/site-packages (from pyvistaqt) (1.9.0)Requirement already satisfied: setuptools in /home/dechin/anaconda3/lib/python3.8/site-packages (from zope.interface>=4.4.2->Twisted>=17.5.0->vtk->pyvista>=0.25.0->pyvistaqt) (52.0.0.post20210125)Installing collected packages: pyvistaqtSuccessfully installed pyvistaqt-0.5.0
到这里为止,我们所需要的插件就基本上安装完成了。
案例测试
到这里为止我们就可以看下这个库的运行效果。
画单个球体
首先执行一个画球的简单案例,这里一般都是在jupyter notebook上实现的,pyvista对于jupyter notebook有较好的支持。
import pyvista as pvsphere = pv.Sphere()sphere.plot(jupyter_backend='static')
运行的效果如下:
pyvistaqt案例
这里是一个官方提供的弹出式窗口的绘图方案:
from threading import Threadimport timeimport numpy as npimport pyvista as pvimport pyvistaqt as pvqtfrom pyvista import examplesglobe = examples.load_globe()globe.point_arrays['scalars'] = np.random.rand(globe.n_points)globe.set_active_scalars('scalars')plotter = pvqt.BackgroundPlotter()plotter.add_mesh(globe, lighting=False, show_edges=True, texture=True, scalars='scalars')plotter.view_isometric()# shrink globe in the backgrounddef shrink(): for i in range(50): globe.points *= 0.95 # Update scalars globe.point_arrays['scalars'] = np.random.rand(globe.n_points) time.sleep(0.5)thread = Thread(target=shrink)thread.start()
执行后会弹出一个pyqt的窗口如下所示:
这个图其实是一个动态图,但是qt的这个方案似乎不能在界面上直接导出gif,这一点比较可惜。不过在pyvista的接口文档中,其实是包含导出gif视频和mp4视频的,相关接口可以参考:GIF生成示例和MP4生成示例这两个案例。
多模块可视化
在pyvista里面可以用MultiBlock将相关的模块都集成起来,比如这个案例中集成了两个球体,其实使用的方法也很简单,就是把创建的对象归纳到一个列表中:
import pyvista as pvsphere1 = pv.Sphere(radius=0.1, center=(0, 0, 0))sphere2 = pv.Sphere(radius=0.1, center=(0, 0, 1))data = [sphere1,sphere2]blocks = pv.MultiBlock(data)blocks.plot(jupyter_backend='static',show_axes=1)
生成的结果如下图所示:
需要注意的是,因为这里都还是静态图片,三维的视角不可以调整,因此如果坐标设置不当的话,有可能导致两个球体的视角刚好重合,看起来就只有一个球体。
多模块可视化耗时
基于上述的MultiBlock,我们可以很方便的生成一大堆的数据,但是这里可视化的速率也是我们不得不考虑的一个因素,所以这里我们尝试一个1000个球体的可视化,并输出时间:
import pyvista as pvimport numpy as npimport timestart_time=time.time()data = [pv.Sphere(radius=0.01, center=(np.random.random(), np.random.random(), np.random.random())) for i in range(1000)]blocks = pv.MultiBlock(data)blocks.plot(jupyter_backend='static',show_axes=1)end_time=time.time()print ('The time cost of ploting {} spheres is: {}s'.format(len(data),end_time-start_time))
生成的结果如下:
经过过程统计,耗时将近10s。
The time cost of ploting 1000 spheres is: 9.896512746810913s
这其实是一个比较慢的速度,让人有点担忧啊,对于一些几十万的体系,那可视化时间不得冲一天去了,这还不包含中间的时间戳。
动态画板
这里要用到我们之前安装的一个插件ipygany,可以在jupyter notebook中显示出来一个动态的画板,这样我们就可以用鼠标去拖动这个三维图,可以看不同的视角,如下是一个简单的单球体案例:
import pyvista as pvsphere = pv.Sphere()plotter = pv.Plotter(notebook=True)plotter.add_mesh(sphere)plotter.show(jupyter_backend='ipygany')
可视化效果图大概这样,只有在jupyter notebook中才能看到效果:
最后补充一个自己写的简单案例,可以在面板上画两个不同位置的三维球,使用方法是直接将两个对象加起来,这个就是python中一些魔法函数的优势了,非常的人性化:
import pyvista as pvplotter = pv.Plotter(notebook=True)plotter.add_mesh(pv.Sphere(radius=0.3,center=(0,0,0))+pv.Sphere(radius=0.3,center=(0,0,1)))plotter.show(jupyter_backend='ipygany')
可视化的效果大概如下:
那么到这里,需要将的基本用例就介绍完成,后续更多的功能,大家可以自行探索。
总结概要
版权声明
更多原著文章请参考:https://www.cnblogs.com/dechinphy/
打赏专用链接:https://www.cnblogs.com/dechinphy/gallery/image/379634.html
腾讯云专栏同步:https://cloud.tencent.com/developer/column/91958
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!