如何在不定义面的情况下在 Python Plotly 中绘制 3D 形状的外部?

问题描述

我正在尝试在 Python Plotly 中绘制一些 3D 形状。为了练习,我试图绘制一个立方体。

我尝试了 Isosurface 命令,因为我只对形状的外部感兴趣,但令人惊讶的是,输出不是立方体。

import plotly.graph_objects as go
import numpy as np 

x=[0,1,1]
y=[0,0]
z=[0,1]

myisosurf = go.Isosurface(x=x,y=y,z=z,value= np.ones(len(x)))
fig = go.figure(data=myisosurf)
fig.show()

plotly isosurface output when plotting a cube

我确实让它与 Mesh3D 命令一起工作(在 here 的帮助下),但它也需要设置 i,j,k 的参数这一事实让我更喜欢更直接的方法。尤其是在处理比立方体更复杂的形状时,设置 i,k 参数会非常困难。

i= [7,4,6,3,6]
j= [3,2,5,3]
k= [0,7,2]

my3dmesh = go.Mesh3d(x=x,i=i,j=j,k=k,intensity = np.linspace(1,8,endpoint=True),name='y')
fig = go.figure(data=my3dmesh)
fig.show()

Cube with Mesh3D

如何让 Python Plotly 在不通过 i,k 参数手动定义其面的情况下显示形状的外部?

解决方法

感谢@Adreas Deak 的评论,看来Mesh3D 命令的alphahull parameter 可以指示Plotly 在输入中显示坐标的凸包。

没有 alphahull 参数(或有 alphahull = -1),Delaunay 三角剖分用于计算坐标周围的面,使用 i,j,k 参数值。 使用 alphahull = 0,凸包方法用于计算坐标周围的面,从而仅生成形状的“外部”,无需设置 i,k 参数。

所以:

import plotly.graph_objects as go
import numpy as np 

my3dmesh = go.Mesh3d(x=x,y=y,z=z,alphahull = 0,intensity = np.linspace(1,1,8,endpoint=True),name='y')
fig = go.Figure(data=my3dmesh)
fig.show()

enter image description here