我有一组 3D 数据(X、Y、Z)和一组值(我们称之为 C)。 X、Y、Z 和 C 的长度相同。
我的目标是通过创建具有 X、Y、Z 点的 3D 网格来绘制表面,并根据 C 的值为每个点(因此表面)着色。
在此处寻求帮助后,我使用 plotly 库设法做到了这一点。在大多数情况下它工作得很好。然而,它不能绘制一个封闭的表面(例如球体),但它只能绘制它的下半部分。
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 值,所以我什至尝试绘制 2 个半形状,一个用于底部,一个用于上部,但这会导致两半中间有一个洞。
这是代码和结果:
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()
有没有办法实现我所需要的?一些解决方案可能是: