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

7lrncoxx  于 2023-03-09  发布在  其他
关注(0)|答案(2)|浏览(268)

我正在尝试使用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参数,它会画得很好,但当然是单色的。
有可能做我想做的事吗?

pxq42qpu

pxq42qpu1#

关于颜色,您需要决定
1.要将数据(points[:,2])与色彩Map表结合使用以对表面进行着色,或者
1.您希望自己指定颜色。
在第一种情况下,cmap需要是matplotlib色彩Map表而不是数组,您可以使用命名的色彩Map表,如"jet",或者创建自己的色彩Map表。
在第二种情况下,您需要省略cmap关键字,而使用facecolors关键字参数,该参数将在后台传递给Poly3DCollection,facecolor参数当前被忽略,在代码中可以看到,尽管facecolor参数正确地传递给了Poly3DCollection,facecolor随后被color参数覆盖,该参数似乎不接受numpy数组。

wtlkbnrh

wtlkbnrh2#

我发现了同样的问题(仍然在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)

相关问题