如何使用matplotlib为指定边构成的四面体表面着色
四面体表面着色实现方案
你可以直接使用已经导入的Poly3DCollection类实现四面体表面着色,核心逻辑是将四面体的4个顶点组合为4个三角面,再将面集合添加到3D坐标轴中即可,具体修改如下:
步骤说明
- 先将你获取到的x/y/z坐标打包为顶点列表,如果返回的边坐标存在重复顶点,需要先去重得到4个独立的四面体顶点
- 定义四面体的4个三角面,每个面由3个顶点组成
- 创建
Poly3DCollection实例,自定义面颜色、透明度、边样式等参数 - 将面集合添加到3D坐标轴中渲染
修改后完整代码
from mpl_toolkits.mplot3d import Axes3D import matplotlib.pyplot as plt from mpl_toolkits.mplot3d.art3d import Poly3DCollection import numpy as np %matplotlib notebook fig = plt.figure() ax = fig.add_subplot(111, projection='3d') x,y,z = nCompoundTetra(bloch_vectors,nTetrahedron).getEdges() x,y,z = list(x)[0],list(y)[0],list(z)[0] # 去重得到4个独立顶点(如果你的x/y/z已经是4个不重复顶点可跳过去重步骤) verts = list(set(zip(x, y, z))) # 定义4个三角面 tetra_faces = [ [verts[0], verts[1], verts[2]], [verts[0], verts[1], verts[3]], [verts[0], verts[2], verts[3]], [verts[1], verts[2], verts[3]] ] # 创建面集合对象,可自定义facecolors调整每个面的颜色,alpha调整透明度 poly = Poly3DCollection( tetra_faces, facecolors=['#f8766d', '#7cae00', '#00bfc4', '#c77cff'], # 四个面分别对应不同颜色 alpha=0.6, edgecolor='g', linewidth=1 ) ax.add_collection3d(poly) ax.scatter3D(x, y, z, color = "black", s = 3.5) # 原来的画线代码可以删除,因为Poly3DCollection已经设置了绿色边 # ax.plot(x,y,z, color="g", linewidth= 1) ax.set_xlim([-1.1, 1.1]) ax.set_ylim([-1.1, 1.1]) ax.set_zlim([-1.1, 1.1]) u = np.linspace(0, 2 * np.pi, 100) v = np.linspace(0, np.pi, 100) xs = np.outer(np.cos(u), np.sin(v)) ys = np.outer(np.sin(u), np.sin(v)) zs = np.outer(np.ones(np.size(u)), np.cos(v)) ax.plot_wireframe(xs, ys, zs, color="grey", alpha=0.15) ax.get_proj = lambda: np.dot(Axes3D.get_proj(ax), np.diag([5, 5, 7, 7])) ax.set_xlim([-1,1]) ax.set_ylim([-1,1]) ax.set_zlim([-1,1]) ax.set_axis_off() plt.tight_layout() plt.show()
注意事项
- 如果去重后顶点顺序异常导致面渲染错误,可以自行调整
tetra_faces里的顶点索引顺序 - 你也可以给
nCompoundTetra类新增getVertices()方法直接返回4个顶点,省去去重步骤更稳定
内容的提问来源于stack exchange,提问作者danuzco
相关产品推荐
相关产品推荐

