如何在python的Surfaceplot上投影一条线?

时间:2019-04-22 05:31:54

标签: python matplotlib intersection mayavi

see the image content我有一个根据存储在CSV文件中的点数据创建的曲面图。如果要在3D创建的曲面上投影一条线(浮在曲面上方),该怎么办?

我尝试了一些代码在xy-xz-yz平面上投影一条线。
我可以看到它在投影线的终点 xy-xz-yz平面。

如果我要投影在使用点数据创建的曲面上。我没有表面方程。我已经创建了可用的点数据。

1 个答案:

答案 0 :(得分:0)

让我们构建一个通用的MCVE,首先我们导入所需的软件包:

import numpy as np
from scipy import interpolate
import matplotlib.pyplot as plt
from mpl_toolkits import mplot3d
import matplotlib.tri as mtri
np.random.seed(123456) # Fix the random seed

现在,我们为表面S生成3D点的集合(注意,它是不规则的网格):

NS = 100
Sx = np.random.uniform(low=-1., high=1., size=(NS,))
Sy = np.random.uniform(low=-1., high=1., size=(NS,))
Sz = -(Sx**2 + Sy**2) + 0.1*np.random.normal(size=(NS,))

以及参数曲线P

NP = 100
t = np.linspace(-1, 1, NP)
Px = t
Py = t**2 - 0.5
Pz = t**3 + 1

解决问题的关键是LinearNDInterpolator,它在N个维度上执行分段线性插值:

PSz = interpolate.LinearNDInterpolator(list(zip(Sx, Sy)), Sz)(list(zip(Px,Py)))

只需要对数据进行整形以适合方法签名,将其从单独的向量转换为形状为(Nsample,Ndims)的矩阵,可以将其转换为:

list(zip(Sx, Sy))

我们可以从顶部检查数据:

tri = mtri.Triangulation(Sx, Sy)
fig, axe = plt.subplots()
axe.plot(Sx, Sy, '+')
axe.plot(Px, Py)
axe.triplot(tri, linewidth=1, color='gray')
axe.set_aspect('equal')
axe.grid()

enter image description here

完整的3D结果显示如下:

axe = plt.axes(projection='3d')
axe.plot_trisurf(tri, Sz, cmap='jet', alpha=0.5)
axe.plot(Px, Py, Pz)
axe.plot(Px, Py, PSz, linewidth=2, color='black')
axe.scatter(Sx, Sy, Sz)
axe.view_init(elev=25, azim=-45)

enter image description here

axe.view_init(elev=75, azim=-45)

enter image description here