Matplotlib 3D投影中zorder属性失效问题求助
解决Matplotlib 3D图形中zorder不生效的问题
问题原因
Matplotlib的3D坐标轴渲染逻辑和2D不同:默认启用深度测试,元素的显示层级由它们在3D空间中的z坐标决定,zorder参数会被直接忽略。当多个元素z坐标完全相同时,实际绘制顺序由元素添加到轴的先后顺序决定——后添加的元素会覆盖先添加的元素。
你的代码中先绘制橙色点(zorder=1),再绘制白色点(zorder=0),所以白色点会显示在橙色点上方,和zorder设置无关。
解决方案1:调整绘制顺序(推荐)
直接调换两个scatter的调用顺序,先画白色小点,再画橙色大点,后绘制的橙色点会自然覆盖在白色点上方:
import matplotlib.pyplot as plt import numpy as np fig = plt.figure() ax = fig.add_subplot(projection='3d') coorx = [1,2,3,4] coory = [1,1,1,1] coorz = [1,1,1,1] for i in range(4): # 先画白色小点 ax.scatter(coorx[i], coory[i], coorz[i], s=2, alpha=1, c='white') # 再画橙色大点 ax.scatter(coorx[i], coory[i], coorz[i], s=coorx[i]*40, alpha=1, c='orange') plt.show()
解决方案2:关闭深度测试(仅适合平面场景)
如果必须通过zorder控制层级,可以关闭3D轴的深度测试,此时zorder会生效,但会丢失3D空间的深度渲染效果:
import matplotlib.pyplot as plt import numpy as np fig = plt.figure() ax = fig.add_subplot(projection='3d') coorx = [1,2,3,4] coory = [1,1,1,1] coorz = [1,1,1,1] # 关闭深度测试,让zorder生效 ax.set_zorder(0) ax.set_facecolor('white') for i in range(4): ax.scatter(coorx[i], coory[i], coorz[i], s=coorx[i]*40, alpha=1, c='orange', zorder=1, depthshade=False) ax.scatter(coorx[i], coory[i], coorz[i], s=2, alpha=1, c='white', zorder=0, depthshade=False) plt.show()
内容的提问来源于stack exchange,提问作者Tina
相关产品推荐
相关产品推荐

