Добавляем легенду и рисуем геометрические фигуры на графиках

Давайте предположим, что в наших координатных осях показаны два графика:

import numpy as np
import matplotlib.pyplot as plt
 
fig = plt.figure(figsize=(7, 4))
ax = fig.add_subplot()
ax.plot(np.arange(0, 5, 0.25))
ax.plot(np.arange(0, 10, 0.5))
plt.show()

Если мы теперь попытаемся отобразить легенду – их краткое описание, с помощью метода:

ax.legend()

то увидим пустой квадратик в верхнем левом углу. Почему в нем ничего нет? Дело в том, что нам нужно для каждой линии (графика) добавить символьное имя. Это делается с помощью именованного параметра label:

ax.plot(np.arange(0, 5, 0.25), label='line1')
ax.plot(np.arange(0, 10, 0.5), label='line2')

Теперь, при запуске программы мы видим следующее окно:

Причем, легенда использует цвет и тип линии графика и если его изменить, например, так:

ax.plot(np.arange(0, 5, 0.25), '--o', label='line1')
ax.plot(np.arange(0, 10, 0.5), ':s', label='line2')

то это автоматически приведет к изменению и в окне легенды:

Также мы можем самостоятельно указывать метки линий при отображении легенды. Для этого достаточно передать список меток в метод legend():

ax.legend(['1', '2'])

Соответственно, параметры label в этом случае можно уже не прописывать.

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

line1, = ax.plot(np.arange(0, 5, 0.25), '--o', label='line1')
line2, = ax.plot(np.arange(0, 10, 0.5), ':s', label='line2')
ax.legend((line2, line1), ['Линия 2', 'Линия 1'])

Далее, с помощью параметра loc можно указывать расположение окна легенды в пределах координатных осей. Этот параметр может принимать следующие значения:

['best', 'upper right', 'upper left', 'lower left', 'lower right', 'right', 'center left', 'center right', 'lower center', 'upper center', 'center']

Названия здесь говорят сами за себя. Например, можно записать:

ax.legend((line2, line1), ['Линия 2', 'Линия 1'], loc='upper right')

и легенда будет расположена в верхнем правом углу. Аналогично используются и другие значения.

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

ax.legend((line2, line1), ['Линия 2', 'Линия 1'], bbox_to_anchor=(0.5, 0.7))

Здесь значения прописываются в диапазоне от 0 до 1 как доли от размеров координатных осей.

Пакет matplotlib позволяет отображать формулы, записанные в формате TeX. Для этого описание нужно заключить между символами $ и использовать режим записи r (row – «сырая» строка без экранирования символов). Например, можно сформировать следующие подписи у графиков:

ax.legend((line2, line1), [r'$f(x) = a \cdot b + c$', r'$f(x) = k \cdot x + b$'])

В результате, увидим такое окно легенды:

Причем, такую TeX-нотацию можно применять для любых текстовых элементов пакета matplotlib.

Наконец, для оформления информации в окне легенды можно использовать следующие параметры:

Параметр

Описание

fontsize

Размер шрифта (число или строка: {'xxsmall', 'x-small', 'small', 'medium', 'large', 'x-large', 'xx-large'})

frameon

Отображать ли рамку у легенды (True/False)

framealpha

Прозрачность фона (вещественное число или None)

facecolor

Цвет заливки

edgecolor

Цвет рамки

title

Текст заголовка, либо значение None

title_fontsize

Размер шрифта для заголовка

Например, можно прописать следующее оформление:

ax.legend((line2, line1), ['Линия 2', 'Линия 1'], bbox_to_anchor=(0.5, 0.6), facecolor='#aaa', framealpha=0.5)

Рисование геометрических фигур на графике

Пакет matplotlib позволяет рисовать произвольные фигуры прямо в координатных осях. Это очень удобно, когда нужно добавить нестандартную графическую информацию к отображаемому графику. Давайте посмотрим как это делается.

Для начала рассмотрим создание ломаной линии с помощью класса Line2D:

from matplotlib.lines import Line2D

Объект ломаной создается путем передачи списка координат по x и y конструктору этого класса:

l1 = Line2D([1, 2, 3], [1, 2, 3])

Затем, вызвать метод add_line() и прописать граничные значения, чтобы линия была видна в поле рисования графика:

ax.add_line(l1)
ax.set(xlim=(1, 3), ylim=(1, 3))

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

x = np.arange(-2*np.pi, 2*np.pi, 0.1)
cos = Line2D(x, np.cos(x))
ax.add_line(cos)
ax.set(xlim=(-2*np.pi, 2*np.pi), ylim=(-1, 1))

Классы других стандартных геометрических фигур находятся в модуле:

from matplotlib.patches import *

Полный список классов можно посмотреть в официальной документации:

https://matplotlib.org/stable/api/patches_api.html

Например, можно нарисовать прямоугольник с помощью класса Rectangle:

rect = Rectangle((0, 0), 2.5, 0.5, facecolor='g')

Здесь мы в начале указываем координаты расположения прямоугольника, а затем, его ширину и высоту. Далее, с помощью параметра facecolor делаем заливку зеленого цвета.

Чтобы отобразить этот прямоугольник в координатных осях, нужно взывать метод:

ax.add_patch(rect)

В результате, получим следующее изображение:

Аналогично можно использовать любой другой класс модуля matplotlib.patches. Вот список основных из них:

Класс

Описание

Arc

Для рисования дуг

Arrow

Для рисования стрелок (см. также ConnectionPatch, FancyArrowPatch и FancyArrow в этом же модуле)

Circle

Для рисования окружностей

CirclePolygon

Для рисования равносторонних многоугольников

Ellipse

Для рисования эллипсов

FancyBboxPatch

Для рисования прямоугольников с разными типами границ (с закругленными углами, в виде стрелок, с зубчатыми ребрами и т.п.)

PathPatch

Для рисования линий или замкнутых областей

Polygon

Для рисования многоугольников

Rectangle

Для рисования прямоугольников

Wedge

Для рисования «клина» (сектора окружности)

Вот пример графика, сформированного с помощью этих классов:

Как видите, изобразительные инструменты пакета matplotlib весьма разнообразны и достаточны, наверное, для любых жизненных ситуаций.