Создание пончиков с использованием path.Path и patches.PathPatch

Beginner

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

Введение

В этом руководстве мы создадим пончик с использованием ~.path.Path и ~.patches.PathPatch из Matplotlib. Мы будем использовать функцию make_circle(), чтобы создать круг, и склеить внутренние и внешние подпути вместе, чтобы создать пончик.

Советы по работе с ВМ

После запуска ВМ нажмите в левом верхнем углу, чтобы переключиться на вкладку Notebook и получить доступ к 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 и т.д.). Затем мы создадим объект Path с использованием mpath.Path и объект PathPatch с использованием mpatches.PathPatch. Наконец, мы добавим объект PathPatch к объекту Axes с использованием ax.add_patch().

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))):
    ## Concatenate the inside and outside subpaths together, changing their
    ## order as needed
    vertices = np.concatenate((outside_vertices[::outside],
                               inside_vertices[::inside]))
    ## Shift the path
    vertices[:, 0] += i * 2.5
    ## The codes will be all "LINETO" commands, except for "MOVETO"s at the
    ## beginning of each subpath
    all_codes = np.concatenate((codes, codes))
    ## Create the Path object
    path = mpath.Path(vertices, all_codes)
    ## Add plot it
    patch = mpatches.PathPatch(path, facecolor='#885500', edgecolor='black')
    ax.add_patch(patch)

    ax.annotate(f"Outside {wise(outside)},\nInside {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, donuts!')
ax.set_aspect(1.0)
plt.show()

Резюме

В этом руководстве мы узнали, как создать пончик с использованием ~.path.Path и ~.patches.PathPatch библиотеки Matplotlib. Мы использовали функцию make_circle(), чтобы создать круг, и склеили внутренние и внешние подпути вместе, чтобы создать пончик. Мы также узнали, как указать тип каждой вершины и создать объект Path с использованием mpath.Path. Наконец, мы узнали, как создать объект PathPatch с использованием mpatches.PathPatch и добавить его к объекту Axes с использованием ax.add_patch().

Резюме

Поздравляем! Вы завершили лабораторную работу по созданию пончиков с использованием ~.path.Path и ~.patches.PathPatch. Вы можете практиковаться в других лабораторных работах в LabEx, чтобы улучшить свои навыки.