Введение
В этом руководстве мы создадим пончик с использованием ~.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, чтобы улучшить свои навыки.