>我正在尝试使用trisurf绘制船体。我需要指定每个三角形的颜色(有很多(。这能做到吗?我试过这个,但它不起作用:
import matplotlib.pyplot as plt:
...
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot_trisurf(points[:,0], points[:,1], points[:,2],
triangles=faces, cmap=facecolors)
plt.show()
facecolors
是一个包含len(faces)
行的矩阵;每行是(R,G,B(。如果我省略cmap
论点,它绘制得很好,但当然是单色的。
可以做我想做的事吗?
关于颜色,您需要决定是否
- 您希望将数据 (
points[:,2]
( 与颜色图结合使用来着色表面,或者如果 - 您想自己指定颜色。
在第一种情况下,cmap
需要是一个 matplotlib 颜色图,而不是一个数组。您可以使用命名色彩图(如 "jet"
(或创建自己的色彩图。
在第二种情况下,您需要省略 当前忽略了人脸颜色参数。在代码中你可以看到,虽然cmap
关键字并改用 facecolors
关键字参数,该参数将在后台传递给Poly3DCollection
。 facecolor
参数被正确地传递给Poly3DCollection
,但 facecolor 随后被 color
参数覆盖,该参数似乎不接受 numpy 数组。
我发现了同样的问题(仍然在 2023 年没有修复(。我使用这段代码避免了它,希望对其他用户有用。
fig = plt.figure()
ax = fig.add_subplot(1,1,1)
#Having a node list (point list) "nodes"
#Having a face list (triangle list) "faces"
#Having a "color_faces" list that contains the colors of each face
polygons = []
for i in range(faces.shape[0]):
face = faces[i]
polygon = Poly3DCollection([nodes[face]], alpha=.75, facecolor= color_faces[i] ,linewidths=2)
polygons.append(polygon)
ax.add_collection3d(polygon)
ax.set_xlim3d(np.min(nodes[:, 0]), np.max(nodes[:, 0]))
ax.set_ylim3d(np.min(nodes[:, 1]), np.max(nodes[:, 1]))
ax.set_zlim3d(np.min(nodes[:, 2]), np.max(nodes[:, 2]))
plt.show()
如果您有节点的颜色信息而不是面的颜色信息,也许这个从形成它的点估计人脸颜色的函数可能会有用。(这只是计算平均值,不做梯度(
def color_nodes2faces(colorNodes,nodes,faces):
colored_faces = []
for face in faces:
face_color = (colorNodes[face[0]] + colorNodes[face[1]] + colorNodes[face[2]]) / 3
colored_faces.append(face_color)
return cm.jet(colored_faces)