使用matplotlib.tri.Triangulation创建一个用于Matplotlib的plot_trisurf的三角剖分

时间:2017-07-21 17:34:13

标签: python matplotlib triangulation

我正在尝试使用public为matplotlibs public struct Point { public double X { get; private set; } public double Y { get; private set; } public Point(double x, double y) { X = x; Y = y; } public Point(Point other) { X = other.X; Y = other.Y; } } 生成三角形。我想指定三角形而不是让matplotlib.tri.Triangulation使用的Delaunay三角剖分,因为它不适用于某些情况,例如xz或yz平面中的三角形。我不确定这个指定三角形是否会解决问题,但我似乎是一件好事。

问题是三角测量需要一个(n,3)数组,其中n是三角形的数量。引用matplotlib.org上的页面"对于每个三角形,组成三角形的三个点的索引,以逆时针方式排序。" https://matplotlib.org/api/tri_api.html#matplotlib.tri.Triangulation 。我无法辨别如何以正确的形式创建数组,这是我想要的帮助。我感谢任何帮助。

到目前为止,我已经尝试了一些东西,但这是我上次尝试的样子:

plot_trisurf

1 个答案:

答案 0 :(得分:1)

matplotlib页面上有an example,显示如何使用点和三角形创建matplotlib.tri.Triangulation。由于这可能会不必要地复杂化,我们可能会进一步简化。

让我们取4个点,这应该创建2个三角形。 triangles参数将以点的索引的形式指定三角形的角。正如文档所说,

  

triangles:整数array_like形状(ntri,3),可选
  对于每个三角形,构成三角形的三个点的索引以逆时针方式排序。 [..]

考虑这个代码,我们有一个(4,2)数组,指定点坐标,具有行中每个点的x和y坐标。然后我们通过使用应该以逆时针方式构成三角形的点的指示来从它们创建三角形。

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.tri as mtri

xy = [[0.3,0.5],
      [0.6,0.8],
      [0.5,0.1],
      [0.1,0.2]]
xy = np.array(xy)

triangles = [[0,2,1],
             [2,0,3]]

triang = mtri.Triangulation(xy[:,0], xy[:,1], triangles=triangles)
plt.triplot(triang, marker="o")

plt.show()

第一个三角形由点0, 2, 1和第二个2,0,3组成。以下图形显示了该代码的可视化。

enter image description here

然后,我们可以创建一个z值列表,并在3D中绘制相同的内容。

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.tri as mtri
from mpl_toolkits.mplot3d import Axes3D

xy = [[0.3,0.5],
      [0.6,0.8],
      [0.5,0.1],
      [0.1,0.2]]
xy = np.array(xy)

triangles = [[0,2,1],
             [2,0,3]]

triang = mtri.Triangulation(xy[:,0], xy[:,1], triangles=triangles)

z = [0.1,0.2,0.3,0.4]

fig, ax = plt.subplots(subplot_kw =dict(projection="3d"))
ax.plot_trisurf(triang, z)

plt.show()

enter image description here