无论如何从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库可以做到这一点,但数据的参数化再次成为问题。
答案 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()
将它们添加到轴。