Matplotlib 3D plot zorder问题
最近在使用Matplotlib模块中的3D作图时,遇到了一个zorder(层次)问题,这里整理一下自己的思路和解决方案。
阅读更多:Matplotlib 教程
Matplotlib 3D plot概述
Matplotlib中的mplot3d模块提供了丰富的3D绘图功能,可以用于可视化数据。在创建3D plot时,需要使用mplot3d模块中的Axes3D类,它继承了matplotlib.axes.Axes类,并增加了3D特有的方法和属性。
使用方法如下:
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
其中,111代表绘图区域,projection=’3d’表示使用3D投影。
现在我们来看一个简单的3D plot例子。假设我们有一组随机生成的数据作为例子:
import numpy as np
x = np.random.normal(size=500)
y = np.random.normal(size=500)
z = np.random.normal(size=500)
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(x, y, z)
plt.show()
这段代码会生成一个随机的3D散点图
zorder问题
zorder代表图层的顺序,越大代表在更高的图层上。对于2D plot,zorder默认是1,即最上面一层。但在3D plot中,zorder的默认值不是1,而是’2.5’。这导致了第一层的图形完全被遮挡。
如下所示的代码中,我们使用了两种颜色来绘制不同分布的数据,但图像并不能按照我们预期的层次显示。
colors = np.random.choice(['g', 'b'], size=500)
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(x[colors=='g'], y[colors=='g'], z[colors=='g'], color='g')
ax.scatter(x[colors=='b'], y[colors=='b'], z[colors=='b'], color='b')
plt.show()
我们可以使用set_zorder方法来改变图层的顺序。为了把第一层的图形放到最上面,我们需要给它更高的zorder值。例如:3。
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(x[colors=='g'], y[colors=='g'], z[colors=='g'], color='g', zorder=3)
ax.scatter(x[colors=='b'], y[colors=='b'], z[colors=='b'], color='b')
plt.show()
现在,图像按照我们预期的层次显示了。绿色的数据点在最上面,蓝色数据点在下面。
总结
在Matplotlib 3D作图中,zorder代表图形的层次。默认情况下,第一层的图形会被其它层的图形遮挡,需要使用set_zorder方法来调整图形的层次。在设定zorder值时,需要注意,值越大,图形在更高的图层上显示。
极客教程