这里有一个例子,创建了一个点云,然后我想拟合一个网格表面。问题出在最后,当我尝试将meshgrid数组传递给一个函数来插值数据时:
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
# Create some point cloud data:
c = 1
a = 3
b = 4
slice = {}
t = np.linspace(0,2*np.pi,50)
for s in np.linspace(1,9,10):
c = 5*s
r = (-s**2+10.0*s)/10.0
X = r*np.cos(t)
Y = r*np.sin(t)
Z = c*(Y**2/b**2 - X**2/a**2) + c
slice[str(int(s))] = np.vstack([X,Y,Z])
# Visualize it:
fig = plt.figure()
ax = fig.gca(projection = '3d')
for k,v in slice.iteritems():
print type(v)
print np.shape(v)
X = v[0,:]
Y = v[1,:]
Z = v[2,:]
ax.scatter(X,Y,Z)
plt.show()
看起来是这样的:
现在我需要根据这些点创建一个表面网格。在这种情况下,由于我只有一个点云而不是函数 z = f(x,y),因此对于表面有多种解释,但在这种情况下,正确的表面应该是创建一个空心的“扭曲圆柱体”。我想通过以下方式解决这个问题:
# stack all points from each slice into one vector for each coordinate:
Xs = []
Ys = []
Zs = []
for k,v in slice.iteritems():
#ax.plot_surface(X,Y,Z)
X = v[0,:]
Y = v[1,:]
Z = v[2,:]
Xs = np.hstack((Xs,X))
Ys = np.hstack((Ys,Y))
Zs = np.hstack((Zs,Z))
XX, YY = np.meshgrid(Xs,Ys)
from scipy import interpolate
f = interpolate.interp2d(Xs,Ys,Zs, kind = 'cubic')
ZZ = f(XX,YY)
然后我就可以使用它进行绘图了
fig = plt.figure()
ax = fig.gca(projection = '3d')
ax.plot_surface(XX, YY, ZZ)
plt.show()
然而,插值函数似乎不能接受数组作为输入参数,因此这种方法可能行不通。是否有人能提出如何正确解决这个问题的建议?
编辑:
实际上,显然无法将数据表示为函数,因为它不是一对一的。