在 Python 的 Matplotlib 中使用 Poly3DCollection 的绘图顺序有问题
Problem with drawing order using Poly3DCollection in Python's Matplotlib
在 this question 中,展示了如何使用 Poly3DCollection
.
绘制填充的 3D 多边形
考虑以下 MWE:
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d.art3d import Poly3DCollection
def drawSquare(xco, yco, zco):
verts = [list(zip(xco, yco, zco))]
temp = Poly3DCollection(verts)
temp.set_facecolor('k')
temp.set_edgecolor('k')
ax.add_collection3d(temp, zs='zco')
fig = plt.figure(1)
plt.clf()
ax = fig.add_subplot(121, projection='3d')
drawSquare([-1, 1, 1, -1], [-1, -1, 1, 1], [1, 1, 1, 1]) #draw top plane
drawSquare([-1, 1, 1, -1], [-1, -1, 1, 1], [-1, -1, -1, -1]) #draw bottom plane
ax.plot3D([-1, 1], [-1, 1], [1, 2], 'red') #draw red line
plt.xlim([-2, 2])
plt.ylim([-2, 2])
ax.set_zlim([-2, 2])
ax = fig.add_subplot(122, projection='3d')
drawSquare([-1, 1, 1, -1], [-1, -1, 1, 1], [1, 1, 1, 1]) #draw top plane
drawSquare([-1, 1, 1, -1], [-1, -1, 1, 1], [-1, -1, -1, -1]) #draw bottom plane
drawSquare([-1, 1, 1, -1], [-1, -1, -1, -1], [1, 1, -1, -1]) #draw side plane 1/4
drawSquare([-1, 1, 1, -1], [1, 1, 1, 1], [1, 1, -1, -1]) #draw side plane 2/4
drawSquare([-1, -1, -1, -1], [-1, 1, 1, -1], [1, 1, -1, -1]) #draw side plane 3/4
drawSquare([1, 1, 1, 1], [-1, 1, 1, -1], [1, 1, -1, -1]) #draw side plane 4/4
ax.plot3D([-1, 1], [-1, 1], [1, 2], 'red') #draw red line
plt.xlim([-2, 2])
plt.ylim([-2, 2])
ax.set_zlim([-2, 2])
plt.show()
得出这个数字:
为什么第二张图中的红线不完全可见,画了更多的黑色方块?在这两种情况下,红线都是要绘制的最后一个对象。
您需要 zorder
才能调出最上面的行。还有 facecolor
中的一些透明胶片('#666666aa' 而不是 'k'
)以制作更好的情节。
ax.plot3D([-1, 1], [-1, 1], [1, 2], 'red', zorder=20)
示例输出:
在 this question 中,展示了如何使用 Poly3DCollection
.
考虑以下 MWE:
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d.art3d import Poly3DCollection
def drawSquare(xco, yco, zco):
verts = [list(zip(xco, yco, zco))]
temp = Poly3DCollection(verts)
temp.set_facecolor('k')
temp.set_edgecolor('k')
ax.add_collection3d(temp, zs='zco')
fig = plt.figure(1)
plt.clf()
ax = fig.add_subplot(121, projection='3d')
drawSquare([-1, 1, 1, -1], [-1, -1, 1, 1], [1, 1, 1, 1]) #draw top plane
drawSquare([-1, 1, 1, -1], [-1, -1, 1, 1], [-1, -1, -1, -1]) #draw bottom plane
ax.plot3D([-1, 1], [-1, 1], [1, 2], 'red') #draw red line
plt.xlim([-2, 2])
plt.ylim([-2, 2])
ax.set_zlim([-2, 2])
ax = fig.add_subplot(122, projection='3d')
drawSquare([-1, 1, 1, -1], [-1, -1, 1, 1], [1, 1, 1, 1]) #draw top plane
drawSquare([-1, 1, 1, -1], [-1, -1, 1, 1], [-1, -1, -1, -1]) #draw bottom plane
drawSquare([-1, 1, 1, -1], [-1, -1, -1, -1], [1, 1, -1, -1]) #draw side plane 1/4
drawSquare([-1, 1, 1, -1], [1, 1, 1, 1], [1, 1, -1, -1]) #draw side plane 2/4
drawSquare([-1, -1, -1, -1], [-1, 1, 1, -1], [1, 1, -1, -1]) #draw side plane 3/4
drawSquare([1, 1, 1, 1], [-1, 1, 1, -1], [1, 1, -1, -1]) #draw side plane 4/4
ax.plot3D([-1, 1], [-1, 1], [1, 2], 'red') #draw red line
plt.xlim([-2, 2])
plt.ylim([-2, 2])
ax.set_zlim([-2, 2])
plt.show()
得出这个数字:
为什么第二张图中的红线不完全可见,画了更多的黑色方块?在这两种情况下,红线都是要绘制的最后一个对象。
您需要 zorder
才能调出最上面的行。还有 facecolor
中的一些透明胶片('#666666aa' 而不是 'k'
)以制作更好的情节。
ax.plot3D([-1, 1], [-1, 1], [1, 2], 'red', zorder=20)
示例输出: