Itโs indicated on 3D Mesh Plots in Python that go.Mesh3d
draws a 3D set of triangles with vertices given by x
, y
and z
..
May I ask how to draw mesh surface in Plotly of which each face may have more than three vertices?
Itโs indicated on 3D Mesh Plots in Python that go.Mesh3d
draws a 3D set of triangles with vertices given by x
, y
and z
..
May I ask how to draw mesh surface in Plotly of which each face may have more than three vertices?
If your polygons are all convex polygons, then you must triangulate them. The array of vertices is the same, but to polygons one associates the array of triangles:
import numpy as np
polygons = [[0,2,7], [1,5,10,12], [6,8,4], [9, 7, 2, 4, 12]]
triangles =[]
for p in polygons:
if len(p) <3:
raise ValueError("each polygon must have len >=3")
elif len(p) == 3:
triangles.append(p)
else:
triangles.extend([[p[0], p[i], p[i+1]] for i in range(1, len(p)-1)])
print(triangles)
[[0, 2, 7],
[1, 5, 10],
[1, 10, 12],
[6, 8, 4],
[9, 7, 2],
[9, 2, 4],
[9, 4, 12]]
Now you can use go.Mesh3d:
x, y, z = vertices.T
i, j, k = np.asarray(triangles).T
fig = go.Figure(go.Mesg3d(x=x, y=y, z=z,
i=i, j=j, k=k,
intensity=z,
colorscale="your_preferred_colorscale"))
Thanks, @empet
However, I didnโt quite get the example code, especially the polygons list of lists. May I ask what does it mean?
Plus, I got the error TypeError: โlistโ object is not callable running the code for this line:
triangles.extend([[p[0], p[i], p[i+1]] for i in range(1, len(p)-1)])
Appreciate your advice.
@oat You addressed the following question:
โMay I ask how to draw mesh surface in Plotly of which each face may have more than three vertices ?โ, but did not mention how many vertices have your faces. So I gave a general answer, when you have triangles, quadrangles, etc in your list of lists, that I caled naturally: polygons
. Perhaps you expected to call it faces
or otherwise, like in your un-specified code. I copied again the code I gave here and pasted in my notebook and it works.
I donโt understand why you get that error. The code is correct. If you want a solution for your usecase, please provide data.