如何在 matplotlib.pyplot.trisurf 中指定颜色



>我正在尝试使用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论点,它绘制得很好,但当然是单色的。

可以做我想做的事吗?

关于颜色,您需要决定是否

  1. 您希望将数据 ( points[:,2] ( 与颜色图结合使用来着色表面,或者如果
  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)

最新更新