Построить трехмерную поверхность из данных {x, y, z} -scatter в python
Я пытаюсь построить трехмерную поверхность, построенную таким образом, чтобы она соответствовала некоторым точкам {x, y, z} в python - в идеале что-то вроде Mathematica ListSurfacePlot3D
. До сих пор я пробовал plot_surface
и plot_wireframe
по моим пунктам безрезультатно.
Только оси с помощью plot_surface
. plot_wireframe
дает кучу squigglys, смутно в форме объекта, но не красивый вид, который показан в документации:
Сравните с результатом 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
:
и используя plot_wireframe
:
и используя ListSurfacePlot3D
:
![enter image description here]()
Ответы
Ответ 1
plot_surface
ожидает значения X, Y, Z в виде 2D-массивов, как было бы возвращено np.meshgrid
. Когда входы регулярно решены таким образом, функция графика неявно знает, какие вершины на поверхности смежны друг с другом и поэтому должны быть соединены с ребрами. В вашем примере, однако, вы передаете ему 1D векторов координат, поэтому функция построения графика должна быть способна определить, какие вершины должны быть соединены.
Функция plot_trisurf
обрабатывает нерегулярно разнесенные точки, выполняя триангуляцию Delaunay, чтобы определить, какие точки должны быть соединены с ребрами таким образом, чтобы избежать "тонких треугольников":
![enter image description here]()