Python Matplotlib三维线穿过曲面

Python Matplotlib三维线穿过曲面,python,3d,matplotlib,Python,3d,Matplotlib,我正在使用贴图将立方体表面上的点转换为球体 我想绘制生成的球体的曲面和立方体边映射的直线 到目前为止,我尝试了以下方法,一次只处理立方体的一个面: import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D def sphere_mapping(xbar,ybar,zbar): xx = xbar**2 yy = ybar**2 zz = zbar*

我正在使用贴图将立方体表面上的点转换为球体

我想绘制生成的球体的曲面和立方体边映射的直线

到目前为止,我尝试了以下方法,一次只处理立方体的一个面:

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

def sphere_mapping(xbar,ybar,zbar):
    xx = xbar**2
    yy = ybar**2
    zz = zbar**2
    x = xbar*np.sqrt(1 - yy/2 - zz/2 + yy*zz/3)
    y = ybar*np.sqrt(1 - xx/2 - zz/2 + xx*zz/3)
    z = zbar*np.sqrt(1 - xx/2 - yy/2 + xx*yy/3)
    return x,y,z

fig = plt.figure()
ax = fig.add_subplot(111,projection='3d',aspect='equal')
sgrd1,sgrd2 = np.meshgrid(np.linspace(-1,1,100),np.linspace(-1,1,100))
sgrd3 = np.ones((100,100))
lgrd1 = np.hstack([np.linspace(-1,1,100),np.ones(100,),np.linspace(1,-1,100),-np.ones(100,)])
lgrd2 = np.hstack([np.ones(100,),np.linspace(1,-1,100),-np.ones(100,),np.linspace(-1,1,100)])
lgrd3 = np.ones(400,)

# Plot surface
# x=+1
x,y,z=transform(fgrd3,fgrd1,fgrd2)
ax.plot_surface(x,y,z,linewidth=0)
# y=+1
x,y,z=transform(fgrd1,fgrd3,fgrd2)
ax.plot_surface(x,y,z,linewidth=0)
# x=-1
x,y,z=transform(-fgrd3,fgrd1,fgrd2)
ax.plot_surface(x,y,z,linewidth=0)
# y=-1
x,y,z=transform(fgrd1,-fgrd3,fgrd2)
ax.plot_surface(x,y,z,linewidth=0)
# z=+1
x,y,z=transform(fgrd2,fgrd1,fgrd3)
ax.plot_surface(x,y,z,linewidth=0)
# z=-1    
x,y,z=transform(fgrd2,fgrd1,-fgrd3)
ax.plot_surface(x,y,z,linewidth=0)

# Plot lines
# x=+1
x,y,z=transform(lgrd3,lgrd1,lgrd2)
ax.plot_wireframe(x,y,z,linewidth=4,color='k')
# y=+1
x,y,z=transform(lgrd1,lgrd3,lgrd2)
ax.plot_wireframe(x,y,z,linewidth=4,color='k')
# x=-1
x,y,z=transform(-lgrd3,lgrd1,lgrd2)
ax.plot_wireframe(x,y,z,linewidth=4,color='k')
# y=-1
x,y,z=transform(lgrd1,-lgrd3,lgrd2)
ax.plot_wireframe(x,y,z,linewidth=4,color='k')
# z=+1
x,y,z=transform(lgrd2,lgrd1,lgrd3)
ax.plot_wireframe(x,y,z,linewidth=4,color='k')
# z=-1    
x,y,z=transform(lgrd2,lgrd1,-lgrd3)
ax.plot_wireframe(x,y,z,linewidth=4,color='k')

plt.show()
这在一定程度上是可行的。我得到了一个球体,我得到了边缘的粗黑线。但是,这些线是通过球体的表面显示的。

如果更改映射,使其仅返回
xbar、ybar、zbar
,则会得到原始多维数据集并正确显示行。


你知道为什么我的线会显示在球体上,以及如何修复它吗?

你能不能加入到图中的链接(因为你没有足够的代表来上传),这样我们就可以看到你的输出是什么样子了?要理解您的意思并不容易,至少在复制结果的数据不存在的情况下是如此。我在最后添加了两个指向图像的链接。Matplotlib主要是一个二维打印库,而三维打印是通过投影和变换完成的。因此,matplotlib绘制的是图层,而不是“真实”3D;绘制对象的图层取决于
zorder
参数。因此,球体曲面顶部显示的线不能同时位于球体的前面和后面。如果您真的需要3D绘图功能,请访问Enthound。谢谢。我使用天篷,所以我会马上开始。解决@nordev描述的问题的一个办法是“用手”将曲面/线条分开。看见