Я хочу построить трехмерное представление экспериментальных данных для отслеживания деформации мембраны. Экспериментально известны только угловые узлы. Однако я хочу построить деформирование общей структуры, и поэтому я хочу, чтобы интерполировать мембрану, чтобы обеспечить хорошую цветопередачу. Побывав вокруг, я приблизился к нему со следующим кодом:
import numpy
from mpl_toolkits.mplot3d import Axes3D
from mpl_toolkits.mplot3d.art3d import Poly3DCollection
import matplotlib.pyplot as plt
from matplotlib import cm
from scipy.interpolate import griddata
x=numpy.array([0, 0, 1, 1])
y=numpy.array([0.5, 0.75, 1, 0.5])
z=numpy.array([0, 0.5, 1,0])
fig = plt.figure()
ax = Axes3D(fig)
verts = [zip(x, y, z)]
PC = Poly3DCollection(verts)
ax.add_collection3d(PC)
xi = numpy.linspace(x.min(),x.max(),20)
yi = numpy.linspace(y.min(),y.max(),20)
zi = griddata((x,y),z, (xi[None,:], yi[:,None]), method='linear')
xig, yig = numpy.meshgrid(xi, -yi)
ax.plot_surface(xig, yig, zi, rstride=1, cstride=1, linewidth=0,cmap=plt.cm.jet,norm=plt.Normalize(vmax=abs(yi).max(), vmin=-abs(yi).max()))
plt.show()
и получить следующий график:
Синий многоугольник - это поверхность, известная своими угловыми узлами, и что я хочу установить цвет. До сих пор поверхность с кодовым покрытием - мой лучший результат. Тем не менее, есть черные полигоны у верхней части поверхности, которые беспокоят меня. Я думаю, что это может быть связано с тем, что поверхность не соответствует мешгриду, и поэтому четвертый угол здесь Нан.
Есть ли обходной путь, чтобы избежать этих черных треугольников или даже лучше лучший способ цветокоррекции поверхности, известной только ее угловыми узлами?
EDIT: вот цифра с решением триангуляции, приведенная в моем первом комментарии, используя следующую команду
triang = tri.Triangulation(x, y)
ax.plot_trisurf(x, y, z, triangles=triang.triangles, cmap=cm.jet,norm=plt.Normalize(vmax=abs(yi).max(), vmin=-abs(yi).max()))