Аннотировать рисунки с использованием AnnotationBbox

PythonPythonBeginner
Практиковаться сейчас

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

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

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