使用scipy.spatial.Delaunay代替matplotlib.tri.三角测量的内置版本

v1uwarro  于 2022-11-10  发布在  其他
关注(0)|答案(2)|浏览(137)

看起来好像matplotlib.tri.Triangulation使用了一个有缺陷的、可能不正确的Delaunay三角剖分实现,该实现将被qHull所取代。
我试图使用mpl_toolkits.mplot3d.plot_trisurf()绘制一个trisurf,遇到了一堆没有帮助的异常(主要是IndexErrorKeyError,没有指出到底是什么地方出了问题)。
由于scipy.spatial.Delaunay已经使用了qHull,我想知道是否有一种方法可以使用scipy的Delaunay三角剖分实现来构建一个matplotlib.tri.Triangulation对象,以便与mpl_toolkits.mplot3d.plot_trisurf()一起使用。
我尝试过通过triangles参数将delaunay.points直接传递给matplotlib.tri.Triangulate,但结果是ValueError: triangles min element is out of bounds

oxf4rvwz

oxf4rvwz1#

http://docs.scipy.org/doc/scipy-0.13.0/reference/generated/scipy.spatial.Delaunay.htmlhttp://matplotlib.org/dev/api/tri_api.html显示器
因此,您需要将点和三角形从qhull传递到Triangulation构造函数:

import numpy as np
import scipy.spatial
import matplotlib
import math

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

# First create the x and y coordinates of the points.

n_angles = 20
n_radii = 10
min_radius = 0.15
radii = np.linspace(min_radius, 0.95, n_radii)
angles = np.linspace(0, 2*math.pi, n_angles, endpoint=False)
angles = np.repeat(angles[..., np.newaxis], n_radii, axis=1)
angles[:, 1::2] += math.pi/n_angles
x = (radii*np.cos(angles)).flatten()
y = (radii*np.sin(angles)).flatten()

# Create the Delaunay tessalation using scipy.spatial

pts = np.vstack([x, y]).T
tess = scipy.spatial.Delaunay(pts)

# Create the matplotlib Triangulation object

x = tess.points[:, 0]
y = tess.points[:, 1]
tri = tess.vertices # or tess.simplices depending on scipy version
triang = mtri.Triangulation(x=pts[:, 0], y=pts[:, 1], triangles=tri)

# Plotting

z = x*x + y*y
fig = plt.figure()
ax = fig.gca(projection='3d')
ax.plot_trisurf(triang, z)
plt.show()

输出(使用matplotlib当前主文件):

c2e8gylq

c2e8gylq2#

@Marco很想知道如何在二维数组中运行这个函数。我希望这会有用。根据坐标的顶点列表应该做成一个数组,并且可以使用mtri. Triangulation进行镶嵌。示例代码如下:

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

verts = np.array([[0.6,0.8],[0.2,0.9],[0.1,-0.5],[0.2,-2]])

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

plt.triplot(triang, marker="o")

plt.show()`enter code here`

相关问题