简介
在本实验中,你将学习如何使用 Matplotlib 创建一个带有 RGB 颜色的 3D 体素图。体素图是一种通过使用立方体来表示数据点,从而在二维图上呈现三维数据的方式。RGB 颜色将用于表示数据的不同值。
虚拟机使用提示
虚拟机启动完成后,点击左上角切换到“笔记本”标签,以访问 Jupyter Notebook 进行练习。
有时,你可能需要等待几秒钟让 Jupyter Notebook 完成加载。由于 Jupyter Notebook 的限制,操作验证无法自动化。
如果你在学习过程中遇到问题,随时向 Labby 提问。课程结束后提供反馈,我们会及时为你解决问题。
导入库
在创建图表之前,我们需要导入所需的库。在这种情况下,我们将使用 Matplotlib 和 NumPy。
import matplotlib.pyplot as plt
import numpy as np
定义坐标和颜色
接下来,我们需要为图表定义坐标和颜色。在这个例子中,我们将使用 np.indices 函数来创建一个 17x17x17 的 RGB 颜色值网格。
r, g, b = np.indices((17, 17, 17)) / 16.0
我们还将定义一个函数 midpoints 来找到网格中值之间的中点。这将在后面用于创建球体。
def midpoints(x):
sl = ()
for _ in range(x.ndim):
x = (x[sl + np.index_exp[:-1]] + x[sl + np.index_exp[1:]]) / 2.0
sl += np.index_exp[:]
return x
创建球体
现在,我们将通过定义一个条件来在图表中创建一个球体,该条件针对的是与图表中心距离在一定范围内的 RGB 值。
rc = midpoints(r)
gc = midpoints(g)
bc = midpoints(b)
sphere = (rc - 0.5)**2 + (gc - 0.5)**2 + (bc - 0.5)**2 < 0.5**2
合并颜色
现在我们要将 RGB 颜色分量合并成一个形状为 (17, 17, 17, 3) 的单一数组。
colors = np.zeros(sphere.shape + (3,))
colors[..., 0] = rc
colors[..., 1] = gc
colors[..., 2] = bc
绘制体素图
最后,我们可以使用 ax.voxels 函数来绘制体素图。我们将传入 RGB 值、球体的条件、面颜色、边颜色和线宽。
ax = plt.figure().add_subplot(projection='3d')
ax.voxels(r, g, b, sphere,
facecolors=colors,
edgecolors=np.clip(2*colors - 0.5, 0, 1), ## brighter
linewidth=0.5)
ax.set(xlabel='r', ylabel='g', zlabel='b')
ax.set_aspect('equal')
plt.show()
总结
在这个实验中,我们学习了如何使用 Matplotlib 创建一个带有 RGB 颜色的 3D 体素图。我们导入了所需的库,定义了坐标和颜色,创建了一个球体,合并了颜色,并绘制了体素图。体素图是在二维图上表示三维数据的一种有用方式,可以通过不同的颜色和形状进行定制,以表示不同类型的数据。