# 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?

@oat

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, 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, p[i], p[i+1]]  for i in range(1, len(p)-1)])

``````

“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.