Что такое легенда и зачем она нужна?
Легенда в Matplotlib — это элемент графика, который сопоставляет визуальные представления (цвета, маркеры, линии) с соответствующими подписями данных. Она помогает зрителям понимать, какие элементы графика соответствуют каким данным, делая ваши визуализации более информативными и доступными. Без легенды, особенно на сложных графиках, интерпретация данных становится затруднительной.
Основы создания графиков в Matplotlib
Прежде чем углубляться в легенды, убедимся, что у нас есть базовое понимание создания графиков в Matplotlib. Обычно это включает импорт библиотеки, создание данных, построение графика и, наконец, отображение графика. Давайте рассмотрим простой пример:
import matplotlib.pyplot as plt
import numpy as np
from typing import List, Tuple
def create_sample_plot(x: List[float], y1: List[float], y2: List[float], label1: str, label2: str) -> None:
"""Creates a sample plot with two lines and a legend.
Args:
x: List of x-coordinates.
y1: List of y-coordinates for the first line.
y2: List of y-coordinates for the second line.
label1: Label for the first line in the legend.
label2: Label for the second line in the legend.
"""
plt.plot(x, y1, label=label1)
plt.plot(x, y2, label=label2)
plt.xlabel("X-Axis")
plt.ylabel("Y-Axis")
plt.title("Sample Plot")
plt.legend()
plt.show()
if __name__ == "__main__":
x_data = np.linspace(0, 10, 100) # Генерируем 100 точек от 0 до 10
y1_data = np.sin(x_data)
y2_data = np.cos(x_data)
create_sample_plot(x_data.tolist(), y1_data.tolist(), y2_data.tolist(), "Sin(x)", "Cos(x)")
Базовое добавление легенды
Использование параметра label при построении графиков
Ключевым моментом для создания легенды является параметр label при построении графиков. Именно он определяет текст, который будет отображаться в легенде для соответствующего элемента.
Вызов функции plt.legend() для отображения легенды
После того, как вы задали подписи для графиков, вызовите функцию plt.legend(), чтобы отобразить легенду на графике. Matplotlib автоматически соберет подписи и создаст легенду.
Автоматическое определение подписей легенды
Если вы используете параметр label при построении графиков, plt.legend() автоматически обнаружит эти подписи и отобразит их в легенде. Если же подписи не заданы, легенда не будет отображаться, или будет пустой.
Настройка расположения легенды
Параметр loc: указание положения легенды (best, upper right, lower left и т.д.)
Параметр loc в функции plt.legend() позволяет указать, где должна быть расположена легенда. Доступны различные предопределенные значения, такие как best (автоматически выбирает оптимальное положение), upper right, lower left, center и другие. Пример:
plt.legend(loc='upper left')
Использование координат для точного позиционирования легенды
Для более точного позиционирования можно использовать координаты. В этом случае loc устанавливается в 'upper left', 'lower left', 'upper right' или 'lower right', а затем используются параметры bbox_to_anchor, чтобы сместить легенду относительно указанного угла. Например, bbox_to_anchor=(1.05, 1) поместит легенду немного правее и выше области графика.
Размещение легенды вне области графика
Размещение легенды вне области графика может быть полезным, если она перекрывает важные данные. Используйте bbox_to_anchor для позиционирования легенды за пределами осей графика. Например:
plt.legend(loc='upper left', bbox_to_anchor=(1.05, 1))
plt.tight_layout() # adjust plot parameters for a tight layout
Настройка внешнего вида легенды
Изменение шрифта и размера текста в легенде
Внешний вид текста в легенде можно настроить с помощью параметров fontsize и fontweight. fontsize принимает числовое значение или строковые значения, такие как small, medium, large. fontweight позволяет сделать текст жирным (bold).
Настройка цвета фона и рамки легенды
Цвет фона легенды можно изменить с помощью параметра facecolor, а цвет рамки — с помощью параметра edgecolor. Также можно настроить толщину рамки с помощью параметра frameon (логическое значение, определяющее, отображать ли рамку) и framealpha (прозрачность рамки).
Изменение прозрачности легенды (параметр alpha)
Параметр alpha управляет прозрачностью легенды. Значение 1 означает полную непрозрачность, а 0 — полную прозрачность.
Управление количеством столбцов в легенде (параметр ncol)
Если в легенде много элементов, можно разделить их на несколько столбцов с помощью параметра ncol. Это может улучшить читаемость легенды.
Добавление тени к легенде (параметр shadow)
Параметр shadow (логическое значение) добавляет тень к легенде, что может улучшить ее визуальное выделение.
Управление элементами легенды
Изменение маркеров и линий в легенде
Matplotlib автоматически генерирует маркеры и линии в легенде, соответствующие элементам графика. Однако, можно вручную управлять этими элементами, используя handles и labels (см. ниже в продвинутых техниках).
Исключение определенных элементов из легенды
Иногда нужно исключить определенные элементы из легенды. Это можно сделать, получив handles и labels с графика и отфильтровав их перед передачей в plt.legend(). Или же можно просто не указывать label для тех графиков, которые не должны отображаться в легенде.
Добавление пользовательских элементов в легенду
Можно добавлять пользовательские элементы в легенду, создавая объекты Line2D или Patch и передавая их в plt.legend() вместе с соответствующими подписями.
Легенды для нескольких графиков в одной области
Создание нескольких графиков с разными подписями
При создании нескольких графиков в одной области (например, с помощью plt.subplot()), каждый график может иметь свою легенду. Главное — правильно задать подписи для каждого графика.
Управление легендами для каждого графика отдельно
Можно управлять легендами для каждого графика отдельно, вызывая plt.legend() в каждой подобласти (subplot). Это позволяет настраивать расположение и внешний вид легенды для каждого графика индивидуально.
Продвинутые техники работы с легендами
Использование handles и labels для более гибкого управления легендой
handles — это список объектов, представляющих элементы графика (линии, маркеры, патчи). labels — это список соответствующих подписей. Получив эти списки с графика, можно манипулировать ими, чтобы создать легенду с нужными элементами и подписями. Например, исключить элементы, изменить порядок отображения, добавить пользовательские элементы.
import matplotlib.pyplot as plt
# Создаем данные для графика
x = [1, 2, 3, 4, 5]
y1 = [2, 4, 6, 8, 10]
y2 = [1, 3, 5, 7, 9]
# Строим графики с метками
line1, = plt.plot(x, y1, label='Линия 1')
line2, = plt.plot(x, y2, label='Линия 2')
# Получаем handles и labels
handles, labels = plt.gca().get_legend_handles_labels()
# Изменяем порядок элементов легенды (Линия 2 перед Линией 1)
plt.legend(handles=[line2, line1], labels=[labels[1], labels[0]])
plt.show()
Создание пользовательских функций для генерации легенд
Для сложных графиков или для повторного использования настроек легенды можно создать пользовательские функции, которые генерируют легенду с заданными параметрами.
Решение распространенных проблем с легендами
Перекрытие легендой элементов графика
Это распространенная проблема. Решения: изменить положение легенды с помощью loc или bbox_to_anchor, использовать plt.tight_layout(), уменьшить размер шрифта в легенде, переместить легенду за пределы графика.
Неправильное отображение символов в легенде
Проблема с кодировкой. Убедитесь, что ваш скрипт сохранен в кодировке UTF-8 и что в подписях используются корректные символы.
Отсутствие легенды при наличии подписей
Убедитесь, что вы вызвали функцию plt.legend(). Также проверьте, что подписи (label) заданы для всех элементов графика, которые должны отображаться в легенде. Проверьте, что тип данных соответствует ожидаемому (например, строка).
Заключение
Краткое повторение основных моментов
Легенда — важный элемент визуализации данных в Matplotlib. Она позволяет сопоставить визуальные элементы графика с соответствующими подписями. Базовое добавление легенды сводится к использованию параметра label при построении графиков и вызову функции plt.legend(). Расположение, внешний вид и элементы легенды можно гибко настраивать. Продвинутые техники позволяют создавать пользовательские легенды и решать распространенные проблемы, такие как перекрытие элементов графика.