Введение
В этом практическом занятии вы научитесь добавлять аннотации к графикам в Matplotlib. Вы узнаете, как выделить конкретные интересные точки и использовать различные наглядные инструменты для привлечения внимания к этим точкам. Инструменты аннотации и вставки текста необходимы для передачи информации и повышения визуального吸引力 графиков.
Советы по работе с ВМ
После запуска виртуальной машины кликните в верхнем левом углу, чтобы переключиться на вкладку Notebook и получить доступ к Jupyter Notebook для практики.
Иногда вам может потребоваться подождать несколько секунд, пока Jupyter Notebook загрузится полностью. Валидация операций не может быть автоматизирована из-за ограничений Jupyter Notebook.
Если вы сталкиваетесь с проблемами во время обучения, не стесняйтесь обращаться к Labby. Оставьте отзыв после занятия, и мы оперативно решим проблему для вас.
Указание точек текста и точек аннотации
Чтобы добавить аннотацию к какой-либо точке, вы должны указать точку аннотации xy=(x, y). Кроме того, вы можете указать точку для вставки текста xytext=(x, y) для этой аннотации. По желанию вы можете указать систему координат для xy и xytext с помощью одной из следующих строк для xycoords и textcoords (по умолчанию 'data'):
- 'figure points' : точки от нижнего левого угла рисунка
- 'figure pixels' : пиксели от нижнего левого угла рисунка
- 'figure fraction' : (0, 0) - нижний левый угол рисунка, (1, 1) - верхний правый
- 'axes points' : точки от нижнего левого угла осей
- 'axes pixels' : пиксели от нижнего левого угла осей
- 'axes fraction' : (0, 0) - нижний левый угол осей, (1, 1) - верхний правый
- 'offset points' : Укажите смещение (в точках) от значения xy
- 'offset pixels' : Укажите смещение (в пикселях) от значения xy
- 'data' : использовать систему координат данных осей
Примечание: для физических систем координат (точек или пикселей) начало координат находится в (нижней, левой) части рисунка или осей.
По желанию вы можете указать свойства стрелки, которые рисуют стрелку от текста до аннотируемой точки, передав словарь с свойствами стрелки. Допустимые ключи:
width: ширина стрелки в точкахfrac: доля длины стрелки, занимаемая головойheadwidth: ширина основания головы стрелки в точкахshrink: сдвинуть конец и основание на некоторый процент от аннотируемой точки и тексталюбой ключ для matplotlib.patches.polygon(например, facecolor)
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.patches import Ellipse
from matplotlib.text import OffsetFrom
## Создаем наш рисунок и данные, которые будем использовать для построения графика
fig, ax = plt.subplots(figsize=(4, 4))
t = np.arange(0.0, 5.0, 0.01)
s = np.cos(2*np.pi*t)
## Строим линию и добавляем несколько простых аннотаций
line, = ax.plot(t, s)
ax.annotate('figure pixels',
xy=(10, 10), xycoords='figure pixels')
ax.annotate('figure points',
xy=(107, 110), xycoords='figure points',
fontsize=12)
ax.annotate('figure fraction',
xy=(.025,.975), xycoords='figure fraction',
horizontalalignment='left', verticalalignment='top',
fontsize=20)
## Следующие примеры демонстрируют, как рисуются эти стрелки.
ax.annotate('point offset from data',
xy=(3, 1), xycoords='data',
xytext=(-10, 90), textcoords='offset points',
arrowprops=dict(facecolor='black', shrink=0.05),
horizontalalignment='center', verticalalignment='bottom')
ax.annotate('axes fraction',
xy=(2, 1), xycoords='data',
xytext=(0.36, 0.68), textcoords='axes fraction',
arrowprops=dict(facecolor='black', shrink=0.05),
horizontalalignment='right', verticalalignment='top')
## Также вы можете использовать отрицательные точки или пиксели, чтобы указать от (правой, верхней) стороны.
## Например, (-10, 10) - это 10 точек слева от правой стороны осей и 10
## точек выше нижней стороны
ax.annotate('pixel offset from axes fraction',
xy=(1, 0), xycoords='axes fraction',
xytext=(-20, 20), textcoords='offset pixels',
horizontalalignment='right',
verticalalignment='bottom')
ax.set(xlim=(-1, 5), ylim=(-3, 5))
Использование нескольких систем координат и типов осей
Вы можете указать xypoint и xytext в разных позициях и системах координат, и по желанию включить соединяющую линию и пометить точку маркером. Аннотации работают и на полярных осях.
fig, ax = plt.subplots(subplot_kw=dict(projection='polar'), figsize=(3, 3))
r = np.arange(0, 1, 0.001)
theta = 2*2*np.pi*r
line, = ax.plot(theta, r)
ind = 800
thisr, thistheta = r[ind], theta[ind]
ax.plot([thistheta], [thisr], 'o')
ax.annotate('a polar annotation',
xy=(thistheta, thisr), ## theta, radius
xytext=(0.05, 0.05), ## fraction, fraction
textcoords='figure fraction',
arrowprops=dict(facecolor='black', shrink=0.05),
horizontalalignment='left',
verticalalignment='bottom')
Настройка стилей стрелки и "пузырька"
Стрелка между xytext и точкой аннотации, а также "пузырь", который обрамляет текст аннотации, могут быть настраиваются в широком диапазоне. Ниже представлены несколько параметров и соответствующие результаты.
fig, ax = plt.subplots(figsize=(8, 5))
t = np.arange(0.0, 5.0, 0.01)
s = np.cos(2*np.pi*t)
line, = ax.plot(t, s, lw=3)
ax.annotate(
'прямая',
xy=(0, 1), xycoords='data',
xytext=(-50, 30), textcoords='offset points',
arrowprops=dict(arrowstyle="->"))
ax.annotate(
'arc3,\nрадиус 0.2',
xy=(0.5, -1), xycoords='data',
xytext=(-80, -60), textcoords='offset points',
arrowprops=dict(arrowstyle="->",
connectionstyle="arc3,rad=.2"))
ax.annotate(
'arc,\nугол 50',
xy=(1., 1), xycoords='data',
xytext=(-90, 50), textcoords='offset points',
arrowprops=dict(arrowstyle="->",
connectionstyle="arc,angleA=0,armA=50,rad=10"))
ax.annotate(
'arc,\nруки',
xy=(1.5, -1), xycoords='data',
xytext=(-80, -60), textcoords='offset points',
arrowprops=dict(
arrowstyle="->",
connectionstyle="arc,angleA=0,armA=40,angleB=-90,armB=30,rad=7"))
ax.annotate(
'угол,\nугол 90',
xy=(2., 1), xycoords='data',
xytext=(-70, 30), textcoords='offset points',
arrowprops=dict(arrowstyle="->",
connectionstyle="angle,angleA=0,angleB=90,rad=10"))
ax.annotate(
'angle3,\nугол -90',
xy=(2.5, -1), xycoords='data',
xytext=(-80, -60), textcoords='offset points',
arrowprops=dict(arrowstyle="->",
connectionstyle="angle3,angleA=0,angleB=-90"))
ax.annotate(
'угол,\nокруглый',
xy=(3., 1), xycoords='data',
xytext=(-60, 30), textcoords='offset points',
bbox=dict(boxstyle="round", fc="0.8"),
arrowprops=dict(arrowstyle="->",
connectionstyle="angle,angleA=0,angleB=90,rad=10"))
ax.annotate(
'угол,\nокруглый4',
xy=(3.5, -1), xycoords='data',
xytext=(-70, -80), textcoords='offset points',
size=20,
bbox=dict(boxstyle="round4,pad=.5", fc="0.8"),
arrowprops=dict(arrowstyle="->",
connectionstyle="angle,angleA=0,angleB=-90,rad=10"))
ax.annotate(
'угол,\nсжатие',
xy=(4., 1), xycoords='data',
xytext=(-60, 30), textcoords='offset points',
bbox=dict(boxstyle="round", fc="0.8"),
arrowprops=dict(arrowstyle="->",
shrinkA=0, shrinkB=10,
connectionstyle="angle,angleA=0,angleB=90,rad=10"))
## Вы можете передать пустую строку, чтобы нарисовать только стрелки аннотации
ax.annotate('', xy=(4., 1.), xycoords='data',
xytext=(4.5, -1), textcoords='data',
arrowprops=dict(arrowstyle="<->",
connectionstyle="bar",
ec="k",
shrinkA=5, shrinkB=5))
ax.set(xlim=(-1, 5), ylim=(-4, 3))
Больше примеров систем координат
Ниже мы покажем несколько дополнительных примеров систем координат и того, как можно задавать расположение аннотаций.
fig, (ax1, ax2) = plt.subplots(1, 2)
bbox_args = dict(boxstyle="round", fc="0.8")
arrow_args = dict(arrowstyle="->")
## Здесь мы демонстрируем пределы системы координат и то, как
## мы размещаем аннотируемый текст.
ax1.annotate('figure fraction : 0, 0', xy=(0, 0), xycoords='figure fraction',
xytext=(20, 20), textcoords='offset points',
ha="left", va="bottom",
bbox=bbox_args,
arrowprops=arrow_args)
ax1.annotate('figure fraction : 1, 1', xy=(1, 1), xycoords='figure fraction',
xytext=(-20, -20), textcoords='offset points',
ha="right", va="top",
bbox=bbox_args,
arrowprops=arrow_args)
ax1.annotate('axes fraction : 0, 0', xy=(0, 0), xycoords='axes fraction',
xytext=(20, 20), textcoords='offset points',
ha="left", va="bottom",
bbox=bbox_args,
arrowprops=arrow_args)
ax1.annotate('axes fraction : 1, 1', xy=(1, 1), xycoords='axes fraction',
xytext=(-20, -20), textcoords='offset points',
ha="right", va="top",
bbox=bbox_args,
arrowprops=arrow_args)
## Также можно создавать перетаскиваемые аннотации
an1 = ax1.annotate('Drag me 1', xy=(.5,.7), xycoords='data',
ha="center", va="center",
bbox=bbox_args)
an2 = ax1.annotate('Drag me 2', xy=(.5,.5), xycoords=an1,
xytext=(.5,.3), textcoords='axes fraction',
ha="center", va="center",
bbox=bbox_args,
arrowprops=dict(patchB=an1.get_bbox_patch(),
connectionstyle="arc3,rad=0.2",
**arrow_args))
an1.draggable()
an2.draggable()
an3 = ax1.annotate('', xy=(.5,.5), xycoords=an2,
xytext=(.5,.5), textcoords=an1,
ha="center", va="center",
bbox=bbox_args,
arrowprops=dict(patchA=an1.get_bbox_patch(),
patchB=an2.get_bbox_patch(),
connectionstyle="arc3,rad=0.2",
**arrow_args))
## Наконец, мы покажем несколько более сложных аннотаций и расположений
text = ax2.annotate('xy=(0, 1)\nxycoords=("data", "axes fraction")',
xy=(0, 1), xycoords=("data", 'axes fraction'),
xytext=(0, -20), textcoords='offset points',
ha="center", va="top",
bbox=bbox_args,
arrowprops=arrow_args)
ax2.annotate('xy=(0.5, 0)\nxycoords=artist',
xy=(0.5, 0.), xycoords=text,
xytext=(0, -20), textcoords='offset points',
ha="center", va="top",
bbox=bbox_args,
arrowprops=arrow_args)
ax2.annotate('xy=(0.8, 0.5)\nxycoords=ax1.transData',
xy=(0.8, 0.5), xycoords=ax1.transData,
xytext=(10, 10),
textcoords=OffsetFrom(ax2.bbox, (0, 0), "points"),
ha="left", va="bottom",
bbox=bbox_args,
arrowprops=arrow_args)
ax2.set(xlim=[-2, 2], ylim=[-2, 2])
Резюме
В этом практическом занятии были рассмотрены основы добавления аннотаций к графикам в Matplotlib. Вы узнали, как задавать точки аннотации и текста, использовать несколько систем координат и типов осей, настраивать стили стрелки и "пузырька", а также увидели дополнительные примеры систем координат. Эти инструменты необходимы для создания более наглядных графиков и эффективного передачи информации.