使用 RGB 创建 3D 体素图

Beginner

This tutorial is from open-source community. Access the source code

简介

在本实验中,你将学习如何使用 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 体素图。我们导入了所需的库,定义了坐标和颜色,创建了一个球体,合并了颜色,并绘制了体素图。体素图是在二维图上表示三维数据的一种有用方式,可以通过不同的颜色和形状进行定制,以表示不同类型的数据。