Python三维绘图神器PyVista初步教程
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用于规范颜色映射范围。
更多推荐


所有评论(0)