python matplotlib plot_trisurf多边形数据

时间:2016-12-20 01:56:21

标签: python matplotlib 3d polygon delaunay

无论如何从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库可以做到这一点,但数据的参数化再次成为问题。

2 个答案:

答案 0 :(得分:0)

您可以查看source code of plot_trisurf以了解matplotlib如何进行三角测量 它基本上在2D网格上执行三角测量并从输入接管z分量 2D三角测量由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

答案 1 :(得分:0)

Poly3DCollection 就是为此目的,绘制没有插值的 3D 多边形。它接受多边形顶点坐标的列表,您只需调用 def changeState(i, j): global buttons b = buttons[i][j] b.config(bg = "white") if b.cget("bg") != "white" else b.config(bg = "black") def newBoard(x = 10,y = 10): global buttons window = createWindow() buttons = [] for i in range(0, y): row = [] for j in range(1, x+1): button = gui.Button(window,bg="black",height=1,width=2,command=lambda i=i, j=j-1: changeState(i,j)) row.append(button) button.place(x=23*(j-1),y=23*(i+2)) buttons.append(row) window.mainloop() 将它们添加到轴。