表面在Matplotlib 3D图中消失

时间:2016-11-17 07:50:10

标签: python matplotlib

我试图绘制一个切出一段的球体。我认为我已经正确地创建了坐标,但我发现当我在切片球体周围平移时,内表面消失了。我究竟做错了什么?如果完全相关,这是使用后端TkAgg在openSUSE Leap 42.1上使用Matplotlib 1.5.1的Python 2.7.3。

Everything correct. After slight pan to the right.

代码

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

fig = pl.figure()
ax = fig.add_subplot(111, projection='3d')

phi = np.linspace(0.5*np.pi, 2.0*np.pi, 100)
theta = np.linspace(0, np.pi, 100)

x = np.outer(np.cos(phi), np.sin(theta))
y = np.outer(np.sin(phi), np.sin(theta))
z = np.outer(np.ones(np.size(phi)), np.cos(theta))
ax.plot_surface(x, y, z, rstride=4, cstride=4, color='b')

r = np.linspace(0.,1.,25)
x = np.outer(r, np.sin(theta))
y = 0.*x
z = np.outer(r, np.cos(theta))
ax.plot_surface(x, y, z, rstride=4, cstride=4, color='g')

ax.view_init(30.,60.)
pl.show()

1 个答案:

答案 0 :(得分:2)

事实证明,这是FAQ中提到的常见问题:

  

我的3D绘图在某些视角看起来不正确

     

这可能是mplot3d最常报道的问题。问题在于 - 从某些视角 - 一个3D物体会出现在另一个物体的前面,即使它在物体后面。这可能会导致图形看起来“物理上不正确”。

     

不幸的是,虽然正在做一些工作来减少这个工件的出现,但它目前是一个棘手的问题,并且在matplotlib支持其核心的3D图形渲染之前无法完全解决。

在这种情况下,您可以通过分别绘制球体的四分之三来创建原始修正。 e.g。

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

fig = pl.figure()
ax = fig.add_subplot(111, projection='3d')

theta = np.linspace(0, np.pi, 100)

# first quarter
phi = np.linspace(0.5*np.pi, 1.0*np.pi, 34)
x = np.outer(np.cos(phi), np.sin(theta))
y = np.outer(np.sin(phi), np.sin(theta))
z = np.outer(np.ones(np.size(phi)), np.cos(theta))
ax.plot_surface(x, y, z, rstride=4, cstride=4, color='b')

# second quarter
phi = np.linspace(1.0*np.pi, 1.5*np.pi, 34)
x = np.outer(np.cos(phi), np.sin(theta))
y = np.outer(np.sin(phi), np.sin(theta))
z = np.outer(np.ones(np.size(phi)), np.cos(theta))
ax.plot_surface(x, y, z, rstride=4, cstride=4, color='b')

# third quarter
phi = np.linspace(1.5*np.pi, 2.0*np.pi, 34)
x = np.outer(np.cos(phi), np.sin(theta))
y = np.outer(np.sin(phi), np.sin(theta))
z = np.outer(np.ones(np.size(phi)), np.cos(theta))
ax.plot_surface(x, y, z, rstride=4, cstride=4, color='b')

r = np.linspace(0.,1.,25)
x = np.outer(r, np.sin(theta))
y = 0.*x
z = np.outer(r, np.cos(theta))
ax.plot_surface(x, y, z, rstride=4, cstride=4, color='g')

ax.view_init(30.,60.)
pl.show()