使用 mesh3d 绘制封闭曲面

问题描述 投票:0回答:0

我有一组 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()

有没有办法实现我所需要的?一些解决方案可能是:

  • 以某种方式填充连接两半的孔
  • 使用不同的库(例如 matplotlib、Open3D)
  • 使用我无法想出的完全不同的方法
  • 先画出球体,再给它上色。我不赞成最后一个解决方案,因为形状应该有点任意(不是函数),但如果不存在其他解决方案,我可以获得 C 的坐标并用它们为球体着色。

结果应如下所示:

python matplotlib plotly mesh surface
© www.soinside.com 2019 - 2024. All rights reserved.