Что такое легенда в Matplotlib и зачем она нужна
Легенда в Matplotlib — это незаменимый элемент визуализации данных, позволяющий идентифицировать различные линии, маркеры или области на графике. Она связывает графические элементы с соответствующими текстовыми описаниями, делая график понятным и информативным.
Без легенды интерпретация сложных графиков, особенно содержащих множество серий данных, становится затруднительной. Легенда помогает читателю быстро и точно понять, что именно отображает каждая часть графика.
Основы создания легенды с использованием plt.legend()
Самый простой способ добавить легенду в Matplotlib — использовать функцию plt.legend(). Эта функция автоматически определяет, какие элементы графика следует включить в легенду, основываясь на метках (labels), присвоенных этим элементам при их создании. Например:
import matplotlib.pyplot as plt
# Данные для графика
x = [1, 2, 3, 4, 5]
y1 = [2, 4, 6, 8, 10]
y2 = [1, 3, 5, 7, 9]
# Создание графика с метками
plt.plot(x, y1, label='Линия 1')
plt.plot(x, y2, label='Линия 2')
# Добавление легенды
plt.legend()
# Отображение графика
plt.show()
В этом примере label определяет текст, отображаемый в легенде для каждой линии. plt.legend() автоматически размещает легенду в «лучшем» месте на графике, чтобы минимизировать перекрытие с данными.
Типичные проблемы с размещением легенды внутри графика
Размещение легенды внутри графика, хоть и удобно по умолчанию, часто приводит к проблемам. Легенда может перекрывать важные данные, мешая их анализу. Кроме того, автоматическое размещение может быть не оптимальным для конкретного графика, особенно если данные сконцентрированы в определенной области.
В таких случаях необходимо вручную управлять положением легенды, чтобы она не заслоняла важные детали и оставалась легко читаемой. Далее рассмотрим способы вывода легенды за пределы области графика.
Вывод легенды за пределы осей графика: основные подходы
Использование bboxtoanchor для точного позиционирования
bbox_to_anchor – ключевой параметр функции plt.legend(), позволяющий точно указать положение легенды относительно графика. Вместо автоматического размещения, вы можете явно задать координаты, куда нужно поместить легенду. Это особенно полезно, когда необходимо вывести легенду за пределы области графика.
Объяснение параметров bboxtoanchor: координаты и размеры
Параметр bbox_to_anchor принимает кортеж из двух или четырех чисел: (x, y, width, height).
(x, y): Координаты точки, к которой привязывается легенда. Значения от 0 до 1 представляют координаты в системе координат осей графика (0,0 – левый нижний угол, 1,1 – правый верхний угол). Значения больше 1 или меньше 0 позволяют разместить легенду за пределами области графика.(width, height)(необязательные): Размеры bounding box легенды в координатах осей графика. Обычно не используются, и легенда автоматически подстраивает размер.
Параметр loc (location) в plt.legend() определяет, какая точка bounding box легенды будет привязана к координатам, указанным в bbox_to_anchor. Возможные значения: ‘upper right’, ‘upper left’, ‘lower right’, ‘lower left’, ‘center’, и другие.
Размещение легенды справа, слева, сверху или снизу от графика
Примеры размещения легенды за пределами графика:
-
Справа:
import matplotlib.pyplot as plt x = [1, 2, 3, 4, 5] y1 = [2, 4, 6, 8, 10] y2 = [1, 3, 5, 7, 9] plt.plot(x, y1, label='Линия 1') plt.plot(x, y2, label='Линия 2') plt.legend(loc='center left', bbox_to_anchor=(1, 0.5)) plt.tight_layout() plt.show()bbox_to_anchor=(1, 0.5)размещает левый центр легенды на правой границе графика (x=1) и посередине по вертикали (y=0.5).plt.tight_layout()предотвращает обрезание легенды. -
Сверху:
plt.legend(loc='lower center', bbox_to_anchor=(0.5, 1.05))bbox_to_anchor=(0.5, 1.05)размещает нижний центр легенды по центру графика по горизонтали (x=0.5) и немного выше верхней границы (y=1.05). -
Снизу:
plt.legend(loc='upper center', bbox_to_anchor=(0.5, -0.15))bbox_to_anchor=(0.5, -0.15)размещает верхний центр легенды по центру графика по горизонтали (x=0.5) и немного ниже нижней границы (y=-0.15).Реклама -
Слева:
plt.legend(loc='center right', bbox_to_anchor=(-0.1, 0.5))bbox_to_anchor=(-0.1, 0.5)размещает правый центр легенды немного левее левой границы графика (x=-0.1) и посередине по вертикали (y=0.5).
Использование fig.legend для вывода общей легенды для нескольких графиков
Создание нескольких графиков (subplots) в Matplotlib
Когда на одной фигуре отображается несколько графиков (subplots), часто требуется общая легенда, относящаяся ко всем графикам сразу. Subplots создаются с помощью plt.subplots() или fig.add_subplot().
import matplotlib.pyplot as plt
# Создание фигуры и двух подграфиков
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(10, 5))
# Данные для графиков
x = [1, 2, 3, 4, 5]
y1 = [2, 4, 6, 8, 10]
y2 = [1, 3, 5, 7, 9]
# Графики с метками
ax1.plot(x, y1, label='Линия 1')
ax2.plot(x, y2, label='Линия 2')
plt.show()
Удаление дублирующихся легенд с отдельных графиков
При использовании fig.legend(), легенды, созданные для отдельных axes (ax1.legend(), ax2.legend()) нужно удалить или не создавать вообще. В противном случае они будут дублироваться.
Добавление общей легенды с помощью fig.legend()
Функция fig.legend() добавляет общую легенду ко всей фигуре. Ей также можно передавать параметры loc и bbox_to_anchor для управления положением. Важно вызвать plt.tight_layout() или вручную настроить отступы, чтобы легенда не перекрывала графики.
import matplotlib.pyplot as plt
# Создание фигуры и двух подграфиков
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(10, 5))
# Данные для графиков
x = [1, 2, 3, 4, 5]
y1 = [2, 4, 6, 8, 10]
y2 = [1, 3, 5, 7, 9]
# Графики с метками
line1, = ax1.plot(x, y1, label='Линия 1') # Запятая нужна для извлечения объекта Line2D
line2, = ax2.plot(x, y2, label='Линия 2') # Запятая нужна для извлечения объекта Line2D
# Добавление общей легенды
fig.legend(handles=[line1, line2], loc='upper center', bbox_to_anchor=(0.5, 0.05), ncol=2)
plt.tight_layout(rect=[0, 0.1, 1, 1]) # Корректировка для размещения легенды снизу
plt.show()
В этом примере handles – это список объектов Line2D, для которых нужно создать легенду. ncol=2 располагает элементы легенды в два столбца. rect в plt.tight_layout() оставляет место внизу фигуры для легенды.
Настройка внешнего вида легенды
Изменение шрифта, размера и цвета текста легенды
Внешний вид текста в легенде можно настроить с помощью параметров prop (для свойств шрифта) и title (для заголовка легенды).
plt.legend(prop={'family': 'serif', 'size': 12, 'color': 'darkred'}, title='Легенда')
Настройка рамки и фона легенды (прозрачность, цвет)
Параметры frameon, facecolor и edgecolor позволяют управлять рамкой и фоном легенды.
plt.legend(frameon=True, facecolor='lightyellow', edgecolor='black', alpha=0.8)
frameon: Включает или отключает рамку легенды (True/False).facecolor: Цвет фона легенды.edgecolor: Цвет рамки легенды.alpha: Прозрачность фона легенды (от 0 до 1).
Управление расположением маркеров и текста в легенде
Параметр handlelength управляет длиной маркера в легенде, а handletextpad – расстоянием между маркером и текстом.
plt.legend(handlelength=2, handletextpad=0.5)
Решение распространенных проблем и продвинутые техники
Легенда перекрывает другие элементы графика: как избежать
Основная проблема – перекрытие данных. Используйте bbox_to_anchor для вывода легенды за пределы графика. Если это невозможно, попробуйте уменьшить размер шрифта в легенде или использовать параметр ncol для размещения элементов легенды в несколько столбцов.
Оптимизация размещения легенды для различных размеров и пропорций графика
Размеры и пропорции графика влияют на оптимальное положение легенды. Экспериментируйте с разными значениями bbox_to_anchor и loc, чтобы найти наилучшее расположение. Учитывайте, что для широкоформатных графиков легенда справа или слева может быть более подходящей, чем сверху или снизу.
Сохранение графиков с корректно расположенной легендой
При сохранении графиков важно убедиться, что легенда не обрезается. Используйте plt.savefig(..., bbox_inches='tight') или fig.savefig(..., bbox_inches='tight'), чтобы сохранить график с учетом всех элементов, включая легенду, вынесенную за пределы осей. plt.tight_layout() также помогает в автоматической подгонке размещения элементов графика перед сохранением.