从X,Y,Z坐标数据创建3D曲面网格

问题描述:

我在.dat文件中有一个非常大的数据集(〜500万行)的X,Y,Z坐标数据。我可以将它作为3D散点图导入,但想要在点之间的3D曲面网格上进行插值。我看了一些例子,包括this,但不能得到它的工作没有得到无效索引错误。从X,Y,Z坐标数据创建3D曲面网格

这是我有:

from pylab import * 
import numpy as np 
from mpl_toolkits.mplot3d import Axes3D 
from matplotlib import cm 
import matplotlib.pyplot as plt 
from matplotlib.mlab import griddata 

x, y, z = loadtxt('test.dat', unpack = True) 

fig = plt.figure() 
ax = fig.add_subplot(111, projection='3d') 

xs = x 
ys = y 
zs = z 


fig = plt.figure() 
ax = fig.gca(projection='3d') 

xi = np.linspace(min(xs), max(xs)) 
yi = np.linspace(min(ys), max(ys)) 

X, Y = np.meshgrid(xi, yi) 
Z = griddata(xs, ys, zs, xi, yi) 

surf = ax.plot_surface(X, Y, Z, rstride=5, cstride=5, cmap=cm.jet, 
         linewidth=1, antialiased=True) 

ax.set_zlim3d(np.min(Z), np.max(Z)) 
fig.colorbar(surf) 

plt.show() 

这里是我的错误:

python test2.py 
Traceback (most recent call last): 
    File "test2.py", line 25, in <module> 
    Z = griddata(xs, ys, zs, xi, yi) 
    File "/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7/site-packages/matplotlib/mlab.py", line 2768, in griddata 
    tri = delaunay.Triangulation(x,y) 
    File "/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7/site-packages/matplotlib/delaunay/triangulate.py", line 90, in __init__ 
    self.hull = self._compute_convex_hull() 
    File "/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7/site-packages/matplotlib/delaunay/triangulate.py", line 115, in _compute_convex_hull 
    edges.update(dict(zip(self.triangle_nodes[border[:,0]][:,1], 
IndexError: invalid index 

我很新的蟒蛇,不能想出解决办法。有任何想法吗?谢谢!

这是该数据集的一部分,我使用的测试:

x = [-0.91392505 -0.89382458 -0.87372404 -0.85362357 -0.83352304 -0.81342256 
-0.79332203 -0.77322155 -0.75312102 -0.73302054 -0.71292001 -0.69281954 
-0.672719 -0.65261853 -0.63251805 -0.61241752 -0.59231698 -0.57221651 
-0.55211604 -0.5320155 ] 
y = [ 111.25222 111.25222 111.25222 111.25222 111.25222 111.25222 
    111.25222 111.25222 111.25222 111.25222 111.25222 111.25222 
    111.25222 111.25222 111.25222 111.25222 111.25222 111.25222 
    111.25222 111.25222] 
z = [ 1.42150589e-06 7.77236906e-08 3.33243515e-05 1.70491203e-05 
    6.01433214e-08 9.20339880e-06 4.21266122e-06 3.39080143e-04 
    1.37568408e-04 7.34613104e-06 1.07246015e-05 3.39363214e-06 
    1.09533859e-04 6.55860058e-05 2.83635192e-04 1.87549119e-06 
    9.96281233e-06 2.78222607e-04 2.88286283e-05 4.60408737e-05] 
+0

如果您提供了一些数据来说明问题,那么您可能会得到更多答案。 – unutbu 2013-03-28 02:01:39

+0

你可以重新格式化数据示例,以便它们可以复制粘贴?另外,你所有的Y值是相同的,是有意的吗? – tacaswell 2013-04-01 18:33:35

+0

Y值相同是正确的。这些只是约500万个总数据点的前20个值,并且Y值在该范围内变化非常缓慢。另外,我相信这些数据是可复制的。我只是尝试过,它的工作;如果不让我知道,我会尝试纠正它。 – 2013-04-01 18:57:10

相当肯定的问题是,您呼叫griddata错误(documentation)。请尝试:

Z = scipy.interpolate.griddata((xs, ys), zs, X, Y) 
+0

我阅读了griddata的文档,并尝试了这个建议。我无法得到它的阴谋。我收到一个错误说:“griddata()至少需要5个参数(给定5)”或“IndexError:无效索引” – 2013-04-01 18:27:16

+1

scipy.interpolate.griddata(points,values,xi,method ='linear',fill_value = nan )'不同于'pylab.griddata(x,y,z,xi,yi,interp ='nn')' – szmoore 2013-12-06 04:20:39

+0

@matches好点。您应该使用mpl版本发布答案。 – tacaswell 2013-12-06 16:04:20