在 Matplotlib 中创建 3D 体素图

Beginner

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

简介

在本实验中,你将学习如何在 Matplotlib 中使用柱坐标创建 3D 体素图。该图将演示如何使用.Axes3D.voxelsxyz参数来创建 3D 体素图。

虚拟机使用提示

虚拟机启动完成后,点击左上角切换到笔记本标签页,以访问 Jupyter Notebook 进行练习。

有时,你可能需要等待几秒钟让 Jupyter Notebook 完成加载。由于 Jupyter Notebook 的限制,操作验证无法自动化。

如果你在学习过程中遇到问题,随时向 Labby 提问。课程结束后提供反馈,我们将立即为你解决问题。

导入库

第一步是导入本实验所需的库。我们将使用matplotlib.pyplotnumpymatplotlib.colors

import matplotlib.pyplot as plt
import numpy as np
import matplotlib.colors

定义中点函数

接下来,我们定义一个midpoints函数来计算坐标数组的中点。该函数稍后将用于计算rthetaz的中点。

def midpoints(x):
    sl = ()
    for i 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 值

在这一步中,我们定义坐标rthetaz,并为每个坐标附上 RGB 值。

r, theta, z = np.mgrid[0:1:11j, 0:np.pi*2:25j, -0.5:0.5:11j]
x = r*np.cos(theta)
y = r*np.sin(theta)

rc, thetac, zc = midpoints(r), midpoints(theta), midpoints(z)

## 定义一个围绕 [0.7, *, 0] 的摆动环面
sphere = (rc - 0.7)**2 + (zc + 0.2*np.cos(thetac*2))**2 < 0.2**2

## 组合颜色分量
hsv = np.zeros(sphere.shape + (3,))
hsv[..., 0] = thetac / (np.pi*2)
hsv[..., 1] = rc
hsv[..., 2] = zc + 0.5
colors = matplotlib.colors.hsv_to_rgb(hsv)

创建 3D 体素图

现在我们使用ax.voxels函数创建 3D 体素图。我们将xyzsphere作为参数传入。我们还使用之前定义的colors数组添加facecolorsedgecolors

ax = plt.figure().add_subplot(projection='3d')
ax.voxels(x, y, z, sphere,
          facecolors=colors,
          edgecolors=np.clip(2*colors - 0.5, 0, 1),  ## 更亮
          linewidth=0.5)

显示图形

最后,我们使用plt.show()函数显示图形。

plt.show()

总结

在本实验中,你学习了如何在 Matplotlib 中使用柱坐标创建 3D 体素图。你还学习了如何定义坐标和 RGB 值,以及如何使用ax.voxels函数创建 3D 体素图。