Введение
В этом практическом занятии мы научимся использовать AnnotationBbox в Matplotlib для добавления аннотаций к рисункам с использованием текста, фигур и изображений. AnnotationBbox представляет собой более детальный метод управления, по сравнению с Axes.annotate. Мы рассмотрим три различных OffsetBox: TextArea, DrawingArea и OffsetImage.
Советы по работе с ВМ
После запуска виртуальной машины кликните в левом верхнем углу, чтобы переключиться на вкладку Notebook и получить доступ к Jupyter Notebook для практики.
Иногда вам может потребоваться подождать несколько секунд, пока Jupyter Notebook полностью загрузится. Валидация операций не может быть автоматизирована из-за ограничений Jupyter Notebook.
Если вы столкнетесь с проблемами во время обучения, не стесняйтесь обращаться к Labby. Оставьте отзыв после занятия, и мы оперативно решим проблему для вас.
Построение точек
Для начала построим две точки, которые мы позже будем аннотировать.
import matplotlib.pyplot as plt
import numpy as np
fig, ax = plt.subplots()
## Определим первую позицию для аннотации (отобразим ее с маркером)
xy1 = (0.5, 0.7)
ax.plot(xy1[0], xy1[1], ".r")
## Определим вторую позицию для аннотации (на этот раз не будем отображать с маркером)
xy2 = [0.3, 0.55]
## Зафиксируем пределы отображения, чтобы увидеть все
ax.set_xlim(0, 1)
ax.set_ylim(0, 1)
plt.show()
Аннотация с использованием TextArea
Теперь давайте добавим аннотацию к первой точке с использованием TextArea.
from matplotlib.offsetbox import AnnotationBbox, TextArea
## Добавим аннотацию к первой позиции в виде текстового поля ('Test 1')
offsetbox = TextArea("Test 1")
ab = AnnotationBbox(offsetbox, xy1,
xybox=(-20, 40),
xycoords='data',
boxcoords="offset points",
arrowprops=dict(arrowstyle="->"),
bboxprops=dict(boxstyle="sawtooth"))
ax.add_artist(ab)
plt.show()
Аннотация с использованием DrawingArea
Далее давайте добавим аннотацию ко второй точке в виде круга с использованием DrawingArea.
from matplotlib.offsetbox import DrawingArea
from matplotlib.patches import Circle
## Добавим аннотацию ко второй позиции в виде круга
da = DrawingArea(20, 20, 0, 0)
p = Circle((10, 10), 10)
da.add_artist(p)
ab = AnnotationBbox(da, xy2,
xybox=(1., xy2[1]),
xycoords='data',
boxcoords=("axes fraction", "data"),
box_alignment=(0.2, 0.5),
arrowprops=dict(arrowstyle="->"),
bboxprops=dict(alpha=0.5))
ax.add_artist(ab)
plt.show()
Аннотация с использованием OffsetImage
Наконец, давайте добавим аннотацию ко второй точке с использованием OffsetImage и изображением Греис Хоппер.
from matplotlib.cbook import get_sample_data
from matplotlib.offsetbox import OffsetImage
## Добавим аннотацию ко второй позиции с использованием изображения (сгенерированного массива пикселей)
arr = np.arange(100).reshape((10, 10))
im = OffsetImage(arr, zoom=2)
im.image.axes = ax
ab = AnnotationBbox(im, xy2,
xybox=(-50., 50.),
xycoords='data',
boxcoords="offset points",
pad=0.3,
arrowprops=dict(arrowstyle="->"))
ax.add_artist(ab)
## Добавим аннотацию ко второй позиции с использованием другого изображения (портрета Греис Хоппер)
with get_sample_data("grace_hopper.jpg") as file:
arr_img = plt.imread(file)
imagebox = OffsetImage(arr_img, zoom=0.2)
imagebox.image.axes = ax
ab = AnnotationBbox(imagebox, xy2,
xybox=(120., -80.),
xycoords='data',
boxcoords="offset points",
pad=0.5,
arrowprops=dict(
arrowstyle="->",
connectionstyle="angle,angleA=0,angleB=90,rad=3")
)
ax.add_artist(ab)
plt.show()
Резюме
В этом практическом занятии мы научились использовать AnnotationBbox в Matplotlib для добавления аннотаций к рисункам с использованием текста, фигур и изображений. Мы рассмотрели три различных OffsetBox: TextArea, DrawingArea и OffsetImage. Используя AnnotationBbox, мы получаем более точный контроль над аннотациями, чем при использовании Axes.annotate.