无论如何从plot_trisurf函数中获取多边形数据(即三角形边)?因为它需要x,y和z数据并创建一个Delaunay三角剖分,所以必须将这些数据放在某个地方......?
可以与下面的例子一起使用的东西会很棒。
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
import matplotlib.pyplot as plt
import numpy as np
n_angles = 36
n_radii = 8
radii = np.linspace(0.125, 1.0, n_radii)
angles = np.linspace(0, 2*np.pi, n_angles, endpoint=False)
angles = np.repeat(angles[..., np.newaxis], n_radii, axis=1)
x = np.append(0, (radii*np.cos(angles)).flatten())
y = np.append(0, (radii*np.sin(angles)).flatten())
z = np.sin(-x*y)
fig = plt.figure()
ax = fig.gca(projection='3d')
ax.plot_trisurf(x, y, z, cmap=cm.jet, linewidth=0.2)
plt.show()
我想使用matplotlib,因为它使用更适合3D数据的Delaunay算法。从我可以锻炼,不会将其参数化为2D,并且可以在更广泛的硬件上轻松获得,而不像mayavi那样接近相同数量的faff。 Plotly也可以是一个选项,虽然我认为这需要将数据参数化为2D,这对我的应用来说并不理想。我知道python scipy中有Delaunay库可以做到这一点,但数据的参数化再次成为问题。
您可以查看source code of plot_trisurf
以了解matplotlib如何进行三角测量。
它基本上在2D网格上执行三角测量并从输入接管z分量。
二维三角测量由matplotlib.tri.triangulation.Triangulation
类完成。
以下可以做你想要的,给你一个顶点数组。
from matplotlib.tri.triangulation import Triangulation
import numpy as np
n_angles = 36
n_radii = 8
radii = np.linspace(0.125, 1.0, n_radii)
angles = np.linspace(0, 2*np.pi, n_angles, endpoint=False)
angles = np.repeat(angles[..., np.newaxis], n_radii, axis=1)
x = np.append(0, (radii*np.cos(angles)).flatten())
y = np.append(0, (radii*np.sin(angles)).flatten())
z = np.sin(-x*y)
tri, args, kwargs = Triangulation.get_from_args_and_kwargs(x, y, z)
triangles = tri.get_masked_triangles()
xt = tri.x[triangles][..., np.newaxis]
yt = tri.y[triangles][..., np.newaxis]
zt = z[triangles][..., np.newaxis]
verts = np.concatenate((xt, yt, zt), axis=2)
print verts