Matplotlib 3D图中表面消失

3
我想绘制一个切割了一部分的球体。我认为我已经正确地创建了坐标,但是当我在切片球体周围移动时,内表面会消失。我做错了什么?如果有任何相关的话,这是在openSUSE Leap 42.1上使用Python 2.7.3和Matplotlib 1.5.1,使用后端TkAgg。请注意保留HTML标签。

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()

2
这是matplotlib 3D引擎的一个问题。它总是有问题决定哪些补丁应该显示在前面。你的“内表面”就被隐藏在球体后面了。你在这里没有做错任何事情,这只是matplotlib工作或不工作的方式。我不知道除了选择适合您的视角或者使用不同的绘图库(如Mayavi)之外,还有什么好的解决方案可以解决这样的问题。 - ImportanceOfBeingErnest
在您的启发下,我发现这实际上已经在FAQ中涵盖了...我的错,没有用正确的术语搜索!我应该自己删除这个问题吗? - Warrick
我不确定,你可以把它留在这里帮助其他遇到同样问题的人意识到这个问题没有好的解决方案。 - ImportanceOfBeingErnest
1
也许,为了让问题得到解决,可以写一个简短的答案,引用FAQ中最相关的部分? - Bart
1个回答

2
原来这是一个非常普遍的问题,它在FAQ中有提到:
引用: 我的3D图在某些视角下看起来不正确。 这可能是mplot3d中最常见的问题。问题在于-从某些视角-一个3D对象会出现在另一个对象的前面,即使它实际上在它的后面。这可能导致绘图看起来不“物理上正确”。 不幸的是,虽然一些工作正在进行以减少这种伪影的发生,但目前这是一个棘手的问题,并且在matplotlib支持3D图形渲染之前无法完全解决。
在这种情况下,您可以通过分别绘制球体的三个四分之三来创建粗略的修复方法,例如:
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()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接