我正在用matplotlib准备3d绘图,我对多个数据集有一个非常奇怪的行为我有两个数据集,基本上描述了3d中的两个壳:一个内壳和一个外壳要在三维中绘制它们,我需要:

fig = plt.figure()

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

ax.scatter(outer_z[:n], outer_x[:n], outer_y[:n], c='black', marker='.', lw=0)
ax.scatter(inner_z[:n],  inner_x[:n], inner_y[:n], c='red', marker='.', lw=0)

ax.set_xlabel("Z")
ax.set_ylabel("X")
ax.set_zlabel("Y")

ax.set_xlim([-5,5])
ax.set_ylim([5,-5])
ax.set_zlim([-5,5])

(轴的顺序只是为了透视)但是,当我保存这个数字时,我不会得到两个壳:
python - Pyplot 3d散点图:后面的点与前面的点重叠-LMLPHPpython - Pyplot 3d散点图:后面的点与前面的点重叠-LMLPHP
我把一层放在另一层上面,后面的点清楚地显示在前面。你可以在图片上看到一些应该在内壳后面的外壳点被绘制在内壳的前面这真的很烦人,因为它不追求“三维绘图”的目的。有没有人知道为什么会发生这种事,以及如何解决?
非常感谢!

最佳答案

我知道这不是解决你问题的办法,但也许可以解释为什么它的行为是这样的。
这与MatPlotLib实际上没有3D引擎有关。mplot3d将您的点投影到2d绘图(每个对象)上,然后matplotlib一次绘制一个对象;matplotlib是一个2d绘图框架,mplot3d是一种小技巧,可以在不需要为matplotlib编写完整的3d引擎的情况下获得一些3d功能。
这意味着你绘制不同图形(在本例中是红点和黑点)的顺序很重要,如果你在红点之后绘制黑点,它们将显示在红点的前面,而不管它们的位置如何。
让我用另一个例子来说明这一点。

theta   = np.linspace(0, 2*np.pi, 100, endpoint=True)

helix_x = np.cos(3*theta)
helix_y = np.sin(3*theta)
helix_z = theta

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

line_x  = np.zeros(100)
line_y  = np.zeros(100)

ax.plot(line_x, line_y, theta, lw='3', color='r')
ax.plot(helix_x, helix_y, helix_z, lw='2', color='k')

ax.set_xlabel("Z")
ax.set_ylabel("X")
ax.set_zlabel("Y")

ax.set_xlim([-1.5,1.5])
ax.set_ylim([-1.5,1.5])
ax.set_zlim([0,2*np.pi])

这将给出:python - Pyplot 3d散点图:后面的点与前面的点重叠-LMLPHP
但是从俯视图上你可以看到这条线在螺旋线里面:
python - Pyplot 3d散点图:后面的点与前面的点重叠-LMLPHP
但是,如果交换绘制这些线的顺序:
ax.plot(line_x, line_y, theta, lw='3', color='r')
ax.plot(helix_x, helix_y, helix_z, lw='2', color='k')

然后可以看到在螺旋线之后绘制的线:
python - Pyplot 3d散点图:后面的点与前面的点重叠-LMLPHP
最终,这意味着您必须手动确定哪些点位于其他点之前然后可以使用zorder参数来确定哪些对象将位于其他对象的前面但对于每个透视图(角度、仰角),都必须这样做在这种情况下,你可能需要把内线分成“螺旋线前”和“螺旋线后”两部分,然后分别在螺旋线的前面和后面绘制它们。
不过,我希望有人能对这件事多加阐述,因为我自己对这个话题很感兴趣我知道mplot3d有一些基本的方法来确保在使用着色算法时,前面的点首先显示出来,我相信,但我不太确定。

关于python - Pyplot 3d散点图:后面的点与前面的点重叠,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33151163/

10-16 19:10