在python中从{x,y,z} - 散射数据绘制3D表面

时间:2013-06-28 14:50:14

标签: python 3d matplotlib

我正在尝试绘制一个3D表面,以适应python中的某些{x,y,z}点 - 理想情况下就像Mathematica ListSurfacePlot3D函数。到目前为止,我已经尝试了plot_surfaceplot_wireframe我的观点无济于事。

仅使用plot_surface渲染轴。 plot_wireframe给出了一堆波浪形,模糊地呈现在对象的形状中,但不是文档中显示的漂亮类型: enter image description hereListSurfacePlot3D的结果进行比较: enter image description here

这是一个最小的工作示例,使用我发布的here

的test.csv文件
import csv
from matplotlib import pyplot
import pylab
from mpl_toolkits.mplot3d import Axes3D

hFile = open("test.csv", 'r')
datfile = csv.reader(hFile)
dat = []

for row in datfile:
        dat.append(map(float,row))

temp = zip(*(dat))

fig = pylab.figure(figsize=pyplot.figaspect(.96))
ax = Axes3D(fig)

然后,

ax.plot_surface(temp[0], temp[1], temp[2])
pyplot.show()

ax.plot_wireframe(temp[0], temp[1], temp[2])
pyplot.show()

这是使用plot_surface呈现的方式: enter image description here 并使用plot_wireframeenter image description here 并使用ListSurfacePlot3Denter image description here

1 个答案:

答案 0 :(得分:12)

plot_surface期望以np.meshgrid返回的二维数组形式的X,Y,Z值。当输入以这种方式定期网格化时,绘图函数隐式地知道表面中的哪些顶点彼此相邻,因此应该与边连接。但是,在您的示例中,您正在处理一维坐标向量,因此绘图函数需要能够确定应该连接哪些顶点。

plot_trisurf函数通过执行Delaunay三角剖分来确定哪些点应该与边连接,以避免“薄三角形”,从而处理不规则间隔的点:

enter image description here