使用 path.Path 和 patches.PathPatch 创建甜甜圈

PythonPythonBeginner
立即练习

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

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在本教程中,我们将使用 Matplotlib 的 ~.path.Path~.patches.PathPatch 创建一个甜甜圈。我们将使用 make_circle() 函数创建圆形,并将内部和外部子路径连接在一起以创建甜甜圈。

虚拟机提示

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

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

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

导入必要的库

我们将从导入本教程所需的库开始。

import matplotlib.pyplot as plt
import numpy as np
import matplotlib.patches as mpatches
import matplotlib.path as mpath

定义辅助函数

我们将定义一个辅助函数 wise() 来确定路径的方向。

def wise(v):
    if v == 1:
        return "CCW"
    else:
        return "CW"

创建圆形

我们将使用 make_circle() 函数创建圆形。该函数以圆的半径作为输入,并返回圆的 x 和 y 坐标。

def make_circle(r):
    t = np.arange(0, np.pi * 2.0, 0.01)
    t = t.reshape((len(t), 1))
    x = r * np.cos(t)
    y = r * np.sin(t)
    return np.hstack((x, y))

创建甜甜圈

我们将通过把内部和外部子路径连接在一起来创建甜甜圈。我们将使用 codes 来指定每个顶点的类型(如 MOVETO、LINETO 等)。然后,我们将使用 mpath.Path 创建一个 Path 对象,并使用 mpatches.PathPatch 创建一个 PathPatch 对象。最后,我们将使用 ax.add_patch()PathPatch 对象添加到 Axes 对象中。

Path = mpath.Path
fig, ax = plt.subplots()

inside_vertices = make_circle(0.5)
outside_vertices = make_circle(1.0)
codes = np.ones(
    len(inside_vertices), dtype=mpath.Path.code_type) * mpath.Path.LINETO
codes[0] = mpath.Path.MOVETO

for i, (inside, outside) in enumerate(((1, 1), (1, -1), (-1, 1), (-1, -1))):
    ## 把内部和外部子路径连接在一起,根据需要改变它们的顺序
    vertices = np.concatenate((outside_vertices[::outside],
                               inside_vertices[::inside]))
    ## 移动路径
    vertices[:, 0] += i * 2.5
    ## 除了每个子路径开头的 "MOVETO" 命令外,所有代码都将是 "LINETO" 命令
    all_codes = np.concatenate((codes, codes))
    ## 创建 Path 对象
    path = mpath.Path(vertices, all_codes)
    ## 添加并绘制它
    patch = mpatches.PathPatch(path, facecolor='#885500', edgecolor='black')
    ax.add_patch(patch)

    ax.annotate(f"外部 {wise(outside)},\n内部 {wise(inside)}",
                (i * 2.5, -1.5), va="top", ha="center")

ax.set_xlim(-2, 10)
ax.set_ylim(-3, 2)
ax.set_title('Mmm, 甜甜圈!')
ax.set_aspect(1.0)
plt.show()

总结

在本教程中,我们学习了如何使用 Matplotlib 的 ~.path.Path~.patches.PathPatch 创建甜甜圈。我们使用 make_circle() 函数创建圆形,并将内部和外部子路径连接在一起以创建甜甜圈。我们还学习了如何指定每个顶点的类型,并使用 mpath.Path 创建一个 Path 对象。最后,我们学习了如何使用 mpatches.PathPatch 创建一个 PathPatch 对象,并使用 ax.add_patch() 将其添加到 Axes 对象中。

总结

恭喜你!你已经完成了使用 ~.path.Path~.patches.PathPatch 创建甜甜圈的实验。你可以在 LabEx 中练习更多实验来提升你的技能。