我想构建实验数据的 3D 表示来跟踪膜的变形。实验上,只有角节点是已知的。但是我想绘制整体结构的变形,这就是为什么我想对膜进行插值以实现它的漂亮颜色图。通过四处搜索,我几乎用以下代码接近它:
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()
并得到以下情节:
蓝色多边形是其角节点已知的表面,我想对其进行颜色映射。到目前为止,彩色映射表面是我最好的结果。然而,表面顶部附近的黑色多边形让我感到不安。我认为这可能是由于表面不适合网格,所以第四个角在这里是一个 Nan。
是否有避免这些黑色三角形的解决方法,或者更好的方法来对仅由其角节点已知的表面进行颜色映射?
编辑:这是使用以下命令在我的第一条评论中给出的三角测量解决方案的图
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()))