如何解决Matplotlib 3D绘图中上层线条被遮挡的问题
3D绘图中线条被曲面异常遮挡问题

按照预期,从(0, 0, 1)到(1, 0, 1)的黑色线条应该完全可见,但实际绘制时出现了被遮挡的情况。请问该如何操作才能得到合理的绘图结果?
最小可复现示例(MWE)
import numpy as np import matplotlib.pyplot as plt fig, ax = plt.subplots(subplot_kw=dict(projection="3d"), constrained_layout=1) x = y = np.linspace(0, 1, 11) X, Y = np.meshgrid(x, y) Z = X+Y ax.plot_surface(X, Y, Z) ax.plot3D([0,1,1,0,0],[0,0,1,1,0],[1,1,1,1,1], color='k', lw=3) plt.show()
解决方案
问题原因
Matplotlib的3D渲染采用简单的深度排序逻辑,当两个绘制对象的深度值完全相等或高度接近时,会出现绘制顺序错乱的Z-fighting问题。本案例中线条的Z值固定为1,和曲面在X+Y=1位置的Z值完全一致,因此出现了异常遮挡。
方法1:给线条添加微小Z轴偏移(最稳妥)
只需要将线条的Z坐标整体调高一个极小的数值(比如0.001),让线条始终处于曲面上方,即可彻底解决深度冲突:
import numpy as np import matplotlib.pyplot as plt fig, ax = plt.subplots(subplot_kw=dict(projection="3d"), constrained_layout=1) x = y = np.linspace(0, 1, 11) X, Y = np.meshgrid(x, y) Z = X+Y ax.plot_surface(X, Y, Z) # Z坐标添加微小偏移 ax.plot3D([0,1,1,0,0],[0,0,1,1,0],[1.001]*5, color='k', lw=3) plt.show()
方法2:调整zorder强制层级
你也可以通过设置zorder参数强制让线条绘制在曲面上层,该方法无需修改坐标,但部分旧版本Matplotlib的3D场景可能存在兼容性问题:
import numpy as np import matplotlib.pyplot as plt fig, ax = plt.subplots(subplot_kw=dict(projection="3d"), constrained_layout=1) x = y = np.linspace(0, 1, 11) X, Y = np.meshgrid(x, y) Z = X+Y ax.plot_surface(X, Y, Z, zorder=1) ax.plot3D([0,1,1,0,0],[0,0,1,1,0],[1,1,1,1,1], color='k', lw=3, zorder=10) plt.show()
内容的提问来源于stack exchange,提问作者gboffi
相关产品推荐
相关产品推荐

