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

示例输出: