Легенда позволяет уточнить, какие данные соответствуют каждой линии или маркеру. Чтобы создать легенду, надо через метод 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 размещает легенды в условном "наилучшем" месте, чтобы избежать перекрытия с данными. Однако также можно указать местоположение легенды, используя параметр
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.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 поддерживает множество параметров, которые позволяют гибко настраивать внешний вид текста.
Основные из них:
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(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()
При работе в функциональном стиле применяется функция 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()
При создании графика в функциональном стиле можно использовать аналогичную функцию 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()