Plotly绘制带C值颜色编码的闭合3D网格曲面遇阻求助
问题:基于3D坐标和数值数组绘制闭合着色曲面
问题背景
拥有一组3D坐标数据(X,Y,Z)及等长数值数组C,目标是创建3D网格曲面并根据C值为曲面着色,要求曲面完整闭合(比如球体)。
Plotly mesh3d的尝试及问题
最初用Plotly的Mesh3d实现,但无法绘制闭合曲面(如球体仅显示下半部分),代码如下:
import plotly.graph_objects as go import numpy as np DATA = np.loadtxt(open("surface.dat", "rb")) Xs = DATA[:,0] Ys = DATA[:,1] Zs = DATA[:,2] value = np.loadtxt(open("0.dat", "rb")) fig = go.Figure(data=[ go.Mesh3d( x=Xs, y=Ys, z=Zs, colorbar_title='value', colorscale="hot", # Intensity of each vertex, which will be interpolated and color-coded intensity=value, showscale=True ) ]) fig.show()
效果:Plotly mesh3d仅显示球体下半部分,原因是无法处理同一(X,Y)对应多个Z值的情况。
拆分曲面的尝试及问题
尝试将曲面拆分为上下两部分分别绘制,但两部分中间出现缝隙,代码如下:
import plotly.graph_objects as go import numpy as np DATA = np.loadtxt(open("surface.dat", "rb")) Xs = DATA[:,0] Ys = DATA[:,1] Zs = DATA[:,2] value = np.loadtxt(open("0.dat", "rb")) #find the permutation that put Z in ascending order p = Zs.argsort() #sort the arrays with that permutation and invert them ('pos' stands for 'positive') Xpos = Xs[p][::-1] Ypos = Ys[p][::-1] Zpos = Zs[p][::-1] Vpos = value[p][::-1] top = go.Mesh3d( x=Xpos, y=Ypos, z=Zpos, colorbar_title='value', colorscale="hot", intensity=Vpos, showscale=True ) bottom = go.Mesh3d( x=Xs, y=Ys, z=Zs, colorbar_title='value', colorscale="hot", intensity=value, showscale=True ) fig = go.Figure(data=[top,bottom]) fig.show()
效果:两个半球中间存在缝隙
需求及可行方向
期望得到完整闭合且按C值着色的曲面效果,可能的解决方向:
- 填补两部分之间的缝隙
- 使用其他库(如matplotlib、Open3D)
- 其他未想到的方法
- 先绘制球体再着色(优先支持任意形状,若无其他方案可考虑)
内容的提问来源于stack exchange,提问作者puccj
相关产品推荐
相关产品推荐

