Построить трехмерную поверхность из данных {x, y, z} -scatter в python

Я пытаюсь построить трехмерную поверхность, построенную таким образом, чтобы она соответствовала некоторым точкам {x, y, z} в python - в идеале что-то вроде Mathematica ListSurfacePlot3D. До сих пор я пробовал plot_surface и plot_wireframe по моим пунктам безрезультатно.

Только оси с помощью plot_surface. plot_wireframe дает кучу squigglys, смутно в форме объекта, но не красивый вид, который показан в документации: enter image description here Сравните с результатом ListSurfacePlot3D: enter image description 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_wireframe: enter image description here и используя ListSurfacePlot3D: enter image description here

Ответы

Ответ 1

plot_surface ожидает значения X, Y, Z в виде 2D-массивов, как было бы возвращено np.meshgrid. Когда входы регулярно решены таким образом, функция графика неявно знает, какие вершины на поверхности смежны друг с другом и поэтому должны быть соединены с ребрами. В вашем примере, однако, вы передаете ему 1D векторов координат, поэтому функция построения графика должна быть способна определить, какие вершины должны быть соединены.

Функция plot_trisurf обрабатывает нерегулярно разнесенные точки, выполняя триангуляцию Delaunay, чтобы определить, какие точки должны быть соединены с ребрами таким образом, чтобы избежать "тонких треугольников":

enter image description here