如何在matplotlib中用三角形顶点的坐标(每个三角形9个数字)绘制三维三角形?

时间:2017-04-13 13:05:19

标签: python matplotlib triangulation mplot3d

我有许多三角形(比如N = 10 ^ 6),其中三角形的每个顶点的(x,y,z)坐标存储在一个文件中。因此每个三角形有9个数字存储在文件中的一行。因此该文件有N行。现在我只想绘制(在3d中)所有填充了一些颜色的三角形。三角形可以相邻也可以不相邻。通过matplotlib文档浏览我非常困惑。请帮助。请不要骂我。

1 个答案:

答案 0 :(得分:2)

在具有最多100万像素的绘图上绘制1000万个三角形可能没有多大意义。在任何情况下,如果您没有关于哪个顶点与哪个顶点相邻的信息,则无法直接使用plot_trisurf方法。

我看到两个选项:

  1. 绘制Poly3DCollection
  2. 过滤数据中的唯一点,并将其提供给plot_trisurf。使用此方法,您可能无法根据您的意愿为三角形着色,但仅根据z值。
  3. 以下是如何从输入数据绘制Poly3DCollection的示例。出于演示的目的,我们首先需要提供一些样本数据(这需要提问者的责任,而不是回答者)。

    import numpy as np
    np.set_printoptions(threshold='nan')
    
    phi = np.linspace(0,2*np.pi, 7)
    x = np.cos(phi) + np.sin(phi)
    y = -np.sin(phi) + np.cos(phi)
    z = np.cos(phi)*0.12+0.7
    
    a = np.zeros((len(phi)-1, 9))
    a[:,0] = x[:-1]
    a[:,1] = y[:-1]
    a[:,2] = z[:-1]
    a[:,3:6] = np.roll( a[:,0:3], -1, axis=0)
    a[:,8] = np.ones_like(phi[:-1])
    a = np.around(a, 2)
    print a
    

    打印

    [[ 1.    1.    0.82  1.37 -0.37  0.76  0.    0.    1.  ]
     [ 1.37 -0.37  0.76  0.37 -1.37  0.64  0.    0.    1.  ]
     [ 0.37 -1.37  0.64 -1.   -1.    0.58  0.    0.    1.  ]
     [-1.   -1.    0.58 -1.37  0.37  0.64  0.    0.    1.  ]
     [-1.37  0.37  0.64 -0.37  1.37  0.76  0.    0.    1.  ]
     [-0.37  1.37  0.76  1.    1.    0.82  0.    0.    1.  ]]
    

    (每组3列属于一个点,第一列为x,第二列为y,第三列,z)。

    现在我们可以实际构建Poly3Dcollection。

    from mpl_toolkits.mplot3d.art3d import Poly3DCollection
    import matplotlib.pyplot as plt
    
    fig = plt.figure()
    ax = fig.add_subplot(111, projection='3d')
    
    fc = ["crimson" if i%2 else "gold" for i in range(a.shape[0])]
    
    poly3d = [[ a[i, j*3:j*3+3] for j in range(3)  ] for i in range(a.shape[0])]
    
    ax.add_collection3d(Poly3DCollection(poly3d, facecolors=fc, linewidths=1))
    
    ax.set_xlim(-1.5,1.5)
    ax.set_ylim(-1.5,1.5)
    
    plt.show()
    

    enter image description here