Легенда, текст и аннотации графика

Последнее обновление: 10.02.2026

Легенда

Легенда позволяет уточнить, какие данные соответствуют каждой линии или маркеру. Чтобы создать легенду, надо через метод Axes.plot и его параметр label присвоить метки каждому отображаемому элементу, а затем вызвать Axes.legend():

import matplotlib.pyplot as plt

days = ["31.01", "03.02", "04.02", "05.02", "06.02", "07.02"]
usd = [75.73, 77.02, 76.98, 76.91, 76.55, 77.05]
euro = [90.47, 91.25, 90.72, 91.11, 90.29, 91.04]

figure, axes = plt.subplots()

axes.plot(days, usd, "ob-", label="Курс доллара")
axes.plot(days, euro, "or-", label="Курс евро")

axes.legend()

plt.show()

В данном случае мы функтически рисуем два графика - для курса доллара и курса евро.

легенда графика в Matplotlib и Python

По умолчанию Matplotlib размещает легенды в условном "наилучшем" месте, чтобы избежать перекрытия с данными. Однако также можно указать местоположение легенды, используя параметр loc со значениями местоположения:

  • "best" (лучшее расположение - выбирается автоматически, значение по умолчанию)

  • "upper right" (вверху справа)

  • "upper left" (вверху слева)

  • "lower left" (внизу слева)

  • "lower right" (внизу справа)

  • "right" (справа)

  • "center left" (в центре слева)

  • "center right" (в центре справа)

  • "lower center" (внизу по центру)

  • "upper center" (вверху по центру)

  • "center" (по центру)

Например:

axes.legend(loc="upper right")

И также можно настроить внешний вид легенды, изменив такие свойства, как fontsize (размер шрифта), fontweight (толщина шрифта), fontfamily (семейство шрифтов) и др. Например:

axes.legend(fontsize=12, framealpha=0.8)

Стоит отметить, что по умолчанию легенда создается для всех графиков. Например, в примере выше отрисовывалось два графика - для каждой валюты. Но мы можем явным образом задать, для каких именно графиков будет создаваться легенда с помощью параметра handles:

import matplotlib.pyplot as plt

days = ["31.01", "03.02", "04.02", "05.02", "06.02", "07.02"]
usd = [75.73, 77.02, 76.98, 76.91, 76.55, 77.05]
euro = [90.47, 91.25, 90.72, 91.11, 90.29, 91.04]

figure, axes = plt.subplots()

line1, = axes.plot(days, usd, "ob-", label="Курс доллара")
line2, = axes.plot(days, euro, "or-", label="Курс евро")

axes.legend(handles=[line1, line2])

plt.show()

Параметру handles передается список линий графика, для которых создается легенда. Каждую линию можно получить в качестве результата из метода axes.plot(). Соответственно с помощью axes.legend(handles=[line1, line2]) указываем, что надо создать легенду для обоих линий.

Но также мы могли бы указать не все, а какие-то отдельные линии:

axes.legend(handles=[line1])
настройка легенды графика в Matplotlib и Python

При использовании функционального подхода для создания легенды применяется функция matplotlib.pyplot.legend(), которая работает аналогично Axes.legend:

import matplotlib.pyplot as plt

days = ["31.01", "03.02", "04.02", "05.02", "06.02", "07.02"]
usd = [75.73, 77.02, 76.98, 76.91, 76.55, 77.05]
euro = [90.47, 91.25, 90.72, 91.11, 90.29, 91.04]

line1, = plt.plot(days, usd, "ob-", label="Курс доллара")
line2, = plt.plot(days, euro, "or-", label="Курс евро")

plt.legend(handles=[line1, line2])

plt.show()

Текстовые надписи

Текстовые надписи могут помочь в понимании некоторых моментов графика. Для добавления текстоа на график применяется функция Axes.text():

Axes.text(x, y, s, fontdict=None, **kwargs)

Ее параметры:

  • x и y: координаты для размещения текста в числах с плавающей точкой. По умолчанию используется система координат данных

  • s: сам текст

Например, возле точки с максимальным значением напишем соответствующий текст:

import matplotlib.pyplot as plt

days = ["31.01", "03.02", "04.02", "05.02", "06.02", "07.02"]
usd = [75.73, 77.02, 76.98, 76.91, 76.55, 77.05]

_, axes = plt.subplots()

axes.plot(days, usd, "ob-")

# Находим максимальное значение и его индекс (позицию по оси X)
max_val = max(usd)
max_idx = usd.index(max_val)

# Добавляем текст
axes.text(max_idx, max_val, f"Макс: {max_val}")

plt.show()

Здесь мы предварительно находим координаты максимального значения и исходя из этого устанавливаем координаты текста и сам текст. Однако текст может быть не очень хорошо расположен:

функция axes.text и текст на графике в Matplotlib и Python

Мы можем исправить эту ситуацию с помощью настройки стилевых значений текста. Функция axes.text() в Matplotlib поддерживает множество параметров, которые позволяют гибко настраивать внешний вид текста. Основные из них:

  • color или c: Цвет текста (например, "red", "#00FF00", "0.5")

  • fontname или family: Семейство шрифтов (например, "serif", "sans-serif", "monospace", "fantasy", "cursive")

  • fontweight или weight: Толщина шрифта ("normal", "bold", "heavy", "light", "ultrabold")

  • fontstyle или style: Стиль шрифта ("normal", "italic", "oblique")

  • fontvariant или variant: Вариант шрифта ("normal", "small-caps")

  • horizontalalignment или ha: Горизонтальное выравнивание относительно точки координат ("left", "center", "right")

  • rotation: Угол поворота текста в градусах или значения "vertical", "horizontal"

  • multialignment: Выравнивание строк внутри многострочного текста ("left", "right", "center")

  • linespacing: Межстрочный интервал (число с плавающей точкой).

  • backgroundcolor: Цвет фона непосредственно под текстом

  • alpha: Прозрачность текста от 0.0 (невидимый) до 1.1 (полностью непрозрачный)

  • bbox: Создает рамку вокруг текста. Принимает словарь с параметрами

    • facecolor: Цвет заливки рамки

    • edgecolor: Цвет границ рамки

    • boxstyle: Форма рамки (например, "round", "square", "sawtooth")

    • pad: Отступ текста от краев рамки.

Применим некоторые из этих параметров:

import matplotlib.pyplot as plt

days = ["31.01", "03.02", "04.02", "05.02", "06.02", "07.02"]
usd = [75.73, 77.02, 76.98, 76.91, 76.55, 77.05]

_, axes = plt.subplots()

axes.plot(days, usd, "ob-")

# Находим максимальное значение и его индекс (позицию по оси X)
max_val = max(usd)
max_idx = usd.index(max_val)

# Добавляем текст
axes.text(max_idx, max_val, f"Макс: {max_val}", fontsize=10, color="blue", ha="right", va="top")

plt.show()

Здесь мы предварительно находим координаты максимального значения и исходя из этого устанавливаем координаты текста и сам текст. Однако текст может быть не очень хорошо расположен:

функция axes.text и настройка текста на графике в Matplotlib и Python

Если текст слишком плотно прижат к точке, можно немного сместить его по вертикали или вертикали, добавив небольшой отступ к соответствующей координате, например, смещение по вертикали:

axes.text(max_idx, max_val + 0.05, f"Макс: {max_val}")

Аналогичным образом можно добавлять и другие надписи на график. Например, также добавим текст и для минимального значения:

import matplotlib.pyplot as plt

days = ["31.01", "03.02", "04.02", "05.02", "06.02", "07.02"]
usd = [75.73, 77.02, 76.98, 76.91, 76.55, 77.05]

_, axes = plt.subplots()

axes.plot(days, usd, "ob-")

# Находим максимальное и минимальное значения и их индексы
max_val = max(usd)
max_idx = usd.index(max_val)
min_val = min(usd)
min_idx = usd.index(min_val)

# Добавляем текст
axes.text(max_idx-0.1, max_val, f"Макс: {max_val}", fontsize=10, color="green", ha="right", va="top")
axes.text(min_idx+0.1, min_val, f"Мин: {min_val}", fontsize=10, color="red", ha="left", va="bottom")

plt.show()
функция axes.text и добавление текста на график в Matplotlib и Python

При работе в функциональном стиле применяется функция matplotlib.pyplot.text(), которая принимает все те же параметры:

import matplotlib.pyplot as plt

days = ["31.01", "03.02", "04.02", "05.02", "06.02", "07.02"]
usd = [75.73, 77.02, 76.98, 76.91, 76.55, 77.05]

plt.plot(days, usd, "ob-")

# Находим максимальное и минимальное значения и их индексы
max_val = max(usd)
max_idx = usd.index(max_val)
min_val = min(usd)
min_idx = usd.index(min_val)

# Добавляем текст
plt.text(max_idx-0.1, max_val, f"Макс: {max_val}", fontsize=10, color="green", ha="right", va="top")
plt.text(min_idx+0.1, min_val, f"Мин: {min_val}", fontsize=10, color="red", ha="left", va="bottom")

plt.show()

Добавление аннотаций

Аннотации представляют более сложный компонент, чем просто текст. И для создания аннотаций Matplotlib предоставляет функцию Axes.annotate():

Axes.annotate(text, xy, xytext=None, xycoords="data", textcoords=None, arrowprops=None, annotation_clip=None, **kwargs)

Функция Axes.annotate() более мощная, чем text(), так как она специально предназначена для создания связей между текстом и точками на графике с помощью стрелок. Ее основные параметры:

  • xy: кортеж (x, y), который указывает на объект для аннотации. Система координат определяется параметром xycoords

  • xytext: кортеж (x, y) с положением самого текста. Система координат определяется параметром textcoords. Если не указать, текст будет прямо в точке xy.

  • arrowprops: словарь свойств стрелки. В нем можно задать:

    • arrowstyle: стиль стрелки (например, "->", "<->", "fancy").

    • connectionstyle: позволяет сделать стрелку изогнутой (например, "arc3,rad=0.3").

    • shrink: "сжимает" стрелку, чтобы она не касалась вплотную точки или текста.

  • xycoords: система координат, в которой заданы xy. Поддерживаются следующие типы значений:

    • "figure points": точки из нижнего левого угла фигуры

    • "figure pixels": пиксели из нижнего левого угла фигуры

    • "figure fraction": доля фигуры из нижнего левого угла

    • "subfigure points": точки из нижнего левого угла подфигуры

    • "subfigure pixels": пиксели из нижнего левого угла подфигуры

    • "subfigure fraction": доля подфигуры из нижнего левого угла

    • "axes points": точки из нижнего левого угла осей

    • "axes pixels": пиксели из нижнего левого угла осей

    • "axes fraction": доля осей из нижнего левого угла слева

    • "data": система координат аннотируемого объекта (по умолчанию)

    • "polar": (theta, r), если не используются собственные координаты "data"

  • textcoords: система координат для параметра xytext. Поддерживаются те же типы значений, что и у xycoords. По умолчанию применяется значение xycoords

Пример применения:

import matplotlib.pyplot as plt

days = ["31.01", "03.02", "04.02", "05.02", "06.02", "07.02"]
usd = [75.73, 77.02, 76.98, 76.91, 76.55, 77.05]

_, axes = plt.subplots()

axes.plot(days, usd, "ob-")

# Находим максимальное и минимальное значения и их индексы
max_val = max(usd)
max_idx = usd.index(max_val)

# Используем annotate вместо text
axes.annotate(
    f"Макс: {max_val}",
    xy=(max_idx, max_val),          # Куда указывает стрелка (координаты точки)
    xytext=(max_idx - 0.5, max_val + 0.2), # Где расположить текст
    arrowprops=dict(
        facecolor="black",          # Цвет заливки стрелки
        shrink=0.05,                # Отступ стрелки от точки и текста
        width=2,                    # Ширина самой стрелки
        headwidth=8                 # Ширина наконечника
    ),
    horizontalalignment="right"     # Выравнивание текста относительно его координат
)

plt.show()
функция axes.annotate и добавление аннотаций на график в Matplotlib и Python

При создании графика в функциональном стиле можно использовать аналогичную функцию matplotlib.pyplot.annotate()

matplotlib.pyplot.annotate(text, xy, xytext=None, xycoords="data", textcoords=None, arrowprops=None, annotation_clip=None, **kwargs)

Пример применения:

import matplotlib.pyplot as plt

days = ["31.01", "03.02", "04.02", "05.02", "06.02", "07.02"]
usd = [75.73, 77.02, 76.98, 76.91, 76.55, 77.05]

plt.plot(days, usd, "ob-")

# Находим максимальное и минимальное значения и их индексы
max_val = max(usd)
max_idx = usd.index(max_val)

# Используем annotate вместо text
plt.annotate(
    f"Макс: {max_val}",
    xy=(max_idx, max_val),          # Куда указывает стрелка (координаты точки)
    xytext=(max_idx - 0.5, max_val + 0.2), # Где расположить текст
    arrowprops=dict(
        facecolor="black",          # Цвет заливки стрелки
        shrink=0.05,                # Отступ стрелки от точки и текста
        width=2,                    # Ширина самой стрелки
        headwidth=8                 # Ширина наконечника
    ),
    horizontalalignment="right"     # Выравнивание текста относительно его координат
)

plt.tight_layout()
plt.show()
Помощь сайту
Юмани:
410011174743222
Номер карты:
4048415020898850
Morty Proxy This is a proxified and sanitized view of the page, visit original site.