Давайте
предположим, что в наших координатных осях показаны два графика:
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()
Если мы теперь
попытаемся отобразить легенду – их краткое описание, с помощью метода:
то увидим пустой
квадратик в верхнем левом углу. Почему в нем ничего нет? Дело в том, что нам
нужно для каждой линии (графика) добавить символьное имя. Это делается с
помощью именованного параметра 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():
Соответственно,
параметры 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 делаем заливку
зеленого цвета.
Чтобы отобразить
этот прямоугольник в координатных осях, нужно взывать метод:
В результате,
получим следующее изображение:
Аналогично можно
использовать любой другой класс модуля matplotlib.patches. Вот список
основных из них:
Класс
|
Описание
|
Arc
|
Для
рисования дуг
|
Arrow
|
Для
рисования стрелок (см. также ConnectionPatch, FancyArrowPatch и FancyArrow в
этом же модуле)
|
Circle
|
Для
рисования окружностей
|
CirclePolygon
|
Для
рисования равносторонних многоугольников
|
Ellipse
|
Для
рисования эллипсов
|
FancyBboxPatch
|
Для
рисования прямоугольников с разными типами границ (с закругленными углами, в
виде стрелок, с зубчатыми ребрами и т.п.)
|
PathPatch
|
Для
рисования линий или замкнутых областей
|
Polygon
|
Для
рисования многоугольников
|
Rectangle
|
Для
рисования прямоугольников
|
Wedge
|
Для
рисования «клина» (сектора окружности)
|
Вот пример
графика, сформированного с помощью этих классов:
Как видите,
изобразительные инструменты пакета matplotlib весьма
разнообразны и достаточны, наверное, для любых жизненных ситуаций.