PyVista安装与示例

PyVista是Python的3D可视化库,实际上是VTK(Visualization Toolkit)的Python封装。VTK是C++编写的工业级3D图形引擎,十分强大,但也十分难用,PyVista将VTK强大的C++对象映射为符合符合NumPy直觉的 Python 数据结构,从而让物理和工程科研人员能够用几行代码完成原本需要数百行 VTK 代码才能实现的3D可视化。

pip安装如下,使用了清华源

pip install "pyvista[all]" -i https://pypi.tuna.tsinghua.edu.cn/simple

安装完成后,可运行官方示例

在这里插入图片描述

代码如下,下载需要一点时间

import pyvista as pv
from pyvista import examples

# or pv.read('path/to/mesh.obj')
mesh = examples.download_aero_bracket()
mesh.plot()

高斯光束的空间分布

光场在空间中的分布是三维的,用Matplotlib很难表现,而这恰好是pyVista的强项。下面先生成高斯光束在空间中的分布情况,其公式为

I = ( ω 0 ω z ) 2 e − x 2 + y 2 ω z 2 ω z = ω 0 1 + ( z z R 2 ) \begin{aligned} I &= \left(\frac{\omega_0}{\omega_z}\right)^2 e^{-\frac{x^2+y^2}{\omega_z^2}}\\ \omega_z &= \omega_0\sqrt{1+\left(\frac{z}{z_R}^2\right)} \end{aligned} Iωz=(ωzω0)2eωz2x2+y2=ω01+(zRz2)

代码如下

import numpy as np

# z, y, x坐标网格
z, y, x = np.ogrid[-3:3:200j, -0.5:0.5:100j, -0.5:0.5:100j]

# 下面四组描述网格的参数,在绘图中会用到
dx, dy, dz = 1.0/99, 1.0/99, 6.0/199
x0, y0, z0 = -0.5, -0.5, -3.0
x1, y1, z1 = 0.5, 0.5, 3.0
Nx, Ny, Nz = 100, 100, 200

# 生成高斯光束
w0 = 0.1   # 束腰半径
zR = 1.0   # 瑞利长度
wz = w0 * np.sqrt(1 + (z / zR)**2)
r2 = x**2 + y**2
I = (w0 / wz)**2 * np.exp(-2 * r2 / wz**2)

pyVista绘图

下面用PyVista截取高斯光场的三个剖面,效果如下,用鼠标拖拽可调整视角

在这里插入图片描述

代码如下

import pyvista as pv
pv.global_theme.font.family = 'times' 

grid = pv.ImageData(
    dimensions=(Nx, Ny, Nz),
    spacing=(dx, dy, dz),
    origin=(x0, y0, z0)
)

# 将展平后的物理场注入网格点数据
grid.point_data["Intensity"] = I.flatten()

# 可视化设置
pl = pv.Plotter(window_size=[1000, 600])

slice_xz = grid.slice(normal="y")
pl.add_mesh(slice_xz, cmap="jet", opacity=0.5, clim=[0, 1])

slice_yz = grid.slice(normal="x")
pl.add_mesh(slice_yz, cmap="jet", opacity=0.5, clim=[0, 1])

# 提取 X-Y 横剖面 (z=0),展示束腰高斯分布
slice_xy = grid.slice(normal="z")
pl.add_mesh(slice_xy, cmap="jet", opacity=0.5, clim=[0, 1])

pl.show_axes()
pl.show()

这段绘图代码虽然很长,但稍微细看,就知道并不复杂。

【pv.ImageData】创建了一个绘图网格grid,输入三项分别为三个维度的坐标点,坐标间隔以及起始坐标。

【pv.Plotter】创建了一个可视化窗口pl。

后续的绘图操作,就是从grid总抽取切片,并在pl中绘制的过程。以xz轴切片为例,先以 y y y轴为法向,做一个切片,位置默认为0,则该切片就是 x z xz xz坐标平面。然后调用pl中的add_mesh方法,添加一个网格图,来绘制slice_xz。其中cmap用于设置伪彩色,opacity用于设置透明度,clim用于规范颜色映射范围。

Logo

这里是“一人公司”的成长家园。我们提供从产品曝光、技术变现到法律财税的全栈内容,并连接云服务、办公空间等稀缺资源,助你专注创造,无忧运营。

更多推荐