Matplotlib 3D绘图zorder问题

mat*_*ich 8 python matplotlib

我有一个由蓝色表面(绘制通过plot_surface)和红色球体(绘制通过scatter)组成的图.曲面的zorder设置为0,并且球体的zorder设置为1(尽管未设置任何zorder值会产生相同的结果).

您可以看到红色球体位于曲面的左侧: 在此输入图像描述

当我旋转绘图时,您可以看到红色球体开始消失在蓝色表面后面,即使它在它前面:

在此输入图像描述

直到红色球体完全消失: 在此输入图像描述

奇怪的是,对于某些角度/视图,红色球体重新出现并再次可见,例如: 在此输入图像描述

这里发生了什么?我已经阅读了其他一些与绘图/ zorder相关的问题,但我还没有看到这种行为,其中一个对象明显位于另一个对象的前方/前方,并且在大多数视角下无法正确显示.

如果我使蓝色表面透明,当它在下面的图中消失时,你可以看到表面后面的红色球体(所以看起来绘图库实际上认为它在表面后面).

jri*_*jri 6

从 Matplotlib 3.5.0 开始,axis3d 有一个设置可以解决这个问题。此设置称为Computed_zorder

例子:

ax = plt.axes(projection='3d',computed_zorder=False)
ax.plot_surface(X, Y, Z,zorder=1)
ax.plot_surface(U, V, W,zorder=2)
Run Code Online (Sandbox Code Playgroud)

zorder最高的元素将显示在顶部。

此处列出了一些默认zorder值:

艺术家 佐德
图像(AxesImage、FigureImage、BboxImage) 0
补丁、补丁集合 1
Line2D、LineCollection(包括小刻度、网格线) 2
主要蜱虫 2.01
文本(包括轴标签和标题) 3
传奇 5


Reg*_*ing 2

这在 Matplotlib 1.5.3 (2016) 中仍然是一个问题。@tacaswell(Matplotlib 开发联合负责人)推荐的替代方案是使用 Mayavi 处理 3D 绘图,这在 Python 绘图库中相对独特,因为它不像许多其他项目(Pandas、 Seaborn,ggplot)。

我可以使用Homebrew和 pip在 OSX 上轻松安装 Mayavi 。

#/bin/bash
# vtk is a mayavi requirement
brew install vtk
pip install mayavi
# Port your matplotlib code to mayavi
# Profit...
Run Code Online (Sandbox Code Playgroud)