如何在Plotly中同时渲染3D STL网格并叠加散点图
Plotly同时渲染STL网格与叠加散点实现方案
核心逻辑
Plotly 中plotly.graph_objects和plotly.express生成的图层(trace)完全兼容,只要将所有图层添加到同一个Figure对象中,就会在同一个3D坐标系下自动叠加渲染,不需要额外做适配。
前置依赖安装
先安装需要的第三方库:
pip install numpy numpy-stl plotly
其中numpy-stl用于读取STL网格文件的顶点、三角面数据。
完整实现代码
import plotly.graph_objects as go import plotly.express as px import numpy as np from stl import mesh # ---------------------- # 1. 读取STL网格数据 # ---------------------- # 替换成你的STL文件路径 stl_mesh = mesh.Mesh.from_file("your_model.stl") # 提取所有顶点坐标 points = stl_mesh.points.reshape(-1, 3) x, y, z = points[:, 0], points[:, 1], points[:, 2] # 提取三角面索引 tri_face = stl_mesh.vectors.reshape(-1, 3) i, j, k = tri_face[:, 0], tri_face[:, 1], tri_face[:, 2] # ---------------------- # 2. 初始化画布并添加网格层 # ---------------------- fig = go.Figure() fig.add_trace( go.Mesh3d( x=x, y=y, z=z, i=i, j=j, k=k, color="#d0d0d0", opacity=0.7, # 设为半透明,避免遮挡表面散点 name="STL模型" ) ) # ---------------------- # 3. 叠加散点层(两种方式二选一即可) # ---------------------- # 替换成你自己的散点坐标数据,这里用随机采样的网格顶点做示例 scatter_x, scatter_y, scatter_z = np.random.choice(x, 100), np.random.choice(y, 100), np.random.choice(z, 100) # 方式1:直接用graph_objects添加散点 fig.add_trace( go.Scatter3d( x=scatter_x, y=scatter_y, z=scatter_z, mode="markers", marker=dict(size=4, color="crimson"), name="标记散点" ) ) # 方式2:用plotly express生成散点后追加到画布(即混用方案) # px_scatter = px.scatter_3d( # x=scatter_x, # y=scatter_y, # z=scatter_z, # color_discrete_sequence=["crimson"] # ) # fig.add_trace(px_scatter.data[0]) # ---------------------- # 4. 调整布局并渲染 # ---------------------- fig.update_layout( scene=dict(aspectmode="data"), # 保持模型原始比例 showlegend=True ) fig.show()
注意事项
- 所有3D图层默认共用同一个
scene坐标系,只要添加到同一个Figure对象就会自动对齐,不需要额外做坐标映射 - 网格透明度建议设置在0.6~0.8区间,不透明的实体会完全挡住表面叠加的散点
- 如果散点是STL模型表面的特征点,只要和STL使用同一套坐标系的数值,就可以实现精准贴合
- 如果STL加载后出现面渲染错乱,可以先对提取的顶点做去重处理,修正三角面索引后再传入Mesh3d
内容的提问来源于stack exchange,提问作者alkanschtein
相关产品推荐
相关产品推荐

