如何用PyVista创建二维二次网格并为不同单元组设置差异化颜色
PyVista二维二次网格按单元分组着色实现
所有PyVista网格类型的单元着色逻辑通用,不存在非结构化网格专属的着色接口:核心是给网格绑定单元维度的分类标量,再通过自定义颜色映射匹配对应颜色即可。
完整实现代码
import pyvista as pv import numpy as np # 1. 生成20×10规模的二维二次四边形网格 # 先生成同规模线性平面网格,再转二次单元,无需手动构造节点连通性 grid = pv.Plane( i_size=20, j_size=10, i_resolution=20, j_resolution=10 ).cast_to_unstructured_grid() # 线性单元转二次单元(边中点自动新增节点,满足二次网格精度要求) grid = grid.linear_to_quadratic() # 校验单元总数,确认是20*10=200个单元 assert grid.n_cells == 200, f"单元数不符合预期,当前为{grid.n_cells}" # 2. 按要求给单元打分组标签 cell_tags = np.full(grid.n_cells, fill_value=2, dtype=np.int8) cell_tags[:50] = 0 # 前50个单元标签0,对应蓝色 cell_tags[50:100] = 1 # 第51-100个单元标签1,对应红色 # 剩余单元标签保持2,对应绿色 # 将标签绑定到网格单元数据 grid.cell_data["cell_group"] = cell_tags # 3. 自定义颜色映射并渲染 custom_cmap = [ (0, 0, 1), # 标签0对应蓝色 (1, 0, 0), # 标签1对应红色 (0, 1, 0) # 标签2对应绿色 ] plotter = pv.Plotter() plotter.add_mesh( grid, scalars="cell_group", cmap=custom_cmap, clim=[0, 2], # 固定标量范围,避免颜色映射偏移 show_edges=True, line_width=0.5 ) plotter.camera_position = "xy" # 固定为正二维视角 plotter.show()
关键说明
- 不需要专门查找非结构化网格的着色方法:结构化网格、非结构化网格、多面体网格的着色逻辑完全一致,只要将分类数据写入
cell_data(按单元着色)或point_data(按节点着色),再在add_mesh时通过scalars指定对应字段名即可。 - 二次网格不需要手动构造:通过
linear_to_quadratic()方法可以直接将任意线性单元网格转为对应类型的二次单元网格,自动补全高阶节点,避免手动编写连通性的繁琐工作。 - 自定义颜色映射时必须指定
clim参数和标签的取值范围一致,否则会出现颜色和分组不匹配的问题。
内容的提问来源于stack exchange,提问作者YassineBenJemaa
相关产品推荐
相关产品推荐

