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