Что такое легенда и зачем она нужна?
Легенда в Matplotlib — это ключевой элемент визуализации данных, который сопоставляет графические представления (линии, маркеры, области) с их соответствующими описаниями. Она позволяет быстро и легко понимать, что именно отображает каждый элемент на графике, делая визуализацию информативной и понятной. В контексте, например, A/B тестирования в интернет-маркетинге, легенда могла бы различать кривые конверсии для разных вариантов дизайна страницы, что критически важно для принятия решений.
Основы создания легенды в Matplotlib (краткий обзор)
Создать базовую легенду в Matplotlib довольно просто. Обычно это делается с помощью функции plt.legend(), которая автоматически добавляет легенду на основе меток (labels), присвоенных графическим элементам при их создании.
import matplotlib.pyplot as plt
import numpy as np
# Пример данных
x: np.ndarray = np.linspace(0, 10, 100)
y1: np.ndarray = np.sin(x)
y2: np.ndarray = np.cos(x)
# Создание графика
plt.plot(x, y1, label='sin(x)')
plt.plot(x, y2, label='cos(x)')
# Добавление легенды
plt.legend()
plt.show()
Проблема размещения легенды внутри графика и ее решения
Размещение легенды непосредственно внутри области графика может привести к перекрытию важных данных, загромождению визуализации и затруднению анализа. Стандартные параметры расположения легенды (например, loc='best') часто не дают оптимального результата. Альтернативные решения, такие как размещение легенды за пределами графика, обеспечивают более чистое и профессиональное представление данных.
Размещение легенды за пределами графика: основные подходы
Использование bboxtoanchor для точного позиционирования
Параметр bbox_to_anchor в функции plt.legend() позволяет точно контролировать положение легенды, указывая координаты, относительно которых она должна быть размещена. Это наиболее гибкий способ размещения легенды вне графика.
Размещение легенды в отдельной оси (axes)
Можно создать отдельную ось (axes) специально для размещения легенды. Это особенно полезно, когда нужно выделить легенду как отдельный визуальный элемент.
Использование constrainedlayout или tightlayout для автоматической подгонки
Функции constrained_layout или tight_layout могут автоматически подгонять размеры графика и легенды, чтобы избежать перекрытий и обеспечить оптимальное использование пространства. Они особенно полезны для сложных графиков с множеством элементов.
Практические примеры размещения легенды вне графика
Пример 1: Размещение легенды справа от графика с использованием bboxtoanchor
import matplotlib.pyplot as plt
import numpy as np
# Данные
x: np.ndarray = np.linspace(0, 10, 100)
y1: np.ndarray = np.sin(x)
y2: np.ndarray = np.cos(x)
# Создание графика
fig, ax = plt.subplots()
ax.plot(x, y1, label='sin(x)')
ax.plot(x, y2, label='cos(x)')
# Размещение легенды справа
ax.legend(loc='center left', bbox_to_anchor=(1, 0.5))
plt.tight_layout()
plt.show()
Пример 2: Размещение легенды под графиком с использованием bboxtoanchor
import matplotlib.pyplot as plt
import numpy as np
# Данные
x: np.ndarray = np.linspace(0, 10, 100)
y1: np.ndarray = np.sin(x)
y2: np.ndarray = np.cos(x)
# Создание графика
fig, ax = plt.subplots()
ax.plot(x, y1, label='sin(x)')
ax.plot(x, y2, label='cos(x)')
# Размещение легенды снизу
ax.legend(loc='upper center', bbox_to_anchor=(0.5, -0.15), fancybox=True, shadow=True, ncol=2)
plt.tight_layout()
plt.show()
Пример 3: Размещение легенды в отдельной оси рядом с графиком
import matplotlib.pyplot as plt
import numpy as np
# Данные
x: np.ndarray = np.linspace(0, 10, 100)
y1: np.ndarray = np.sin(x)
y2: np.ndarray = np.cos(x)
# Создание графика и дополнительной оси для легенды
fig, (ax1, ax2) = plt.subplots(1, 2, gridspec_kw={'width_ratios': [3, 1]})
ax1.plot(x, y1, label='sin(x)')
ax1.plot(x, y2, label='cos(x)')
# Удаление осей на второй оси и добавление легенды
ax2.axis('off')
ax1.legend(loc='center left', bbox_to_anchor=(1, 0.5), handlelength=2)
fig.canvas.draw()
renderer = fig.canvas.get_renderer()
bbox = ax1.legend_.get_window_extent(renderer)
width, height = bbox.width, bbox.height
#plt.tight_layout()
plt.show()
Настройка внешнего вида легенды
Изменение шрифта, размера и цвета текста легенды
Внешний вид текста легенды можно настроить с помощью параметров fontsize, fontweight и color.
Настройка рамок и фона легенды
Параметры edgecolor, facecolor, shadow и framealpha позволяют изменять внешний вид рамки и фона легенды.
Изменение порядка и расположения элементов в легенде
Порядок элементов в легенде можно изменить, передав список меток (labels) в функцию plt.legend(). Параметр ncol управляет количеством столбцов в легенде.
Решение распространенных проблем
Перекрытие легенды другими элементами графика
Используйте bbox_to_anchor для точного позиционирования или constrained_layout/tight_layout для автоматической подгонки.
Некорректное отображение легенды при изменении размеров окна
Используйте plt.tight_layout() или fig.tight_layout() для автоматической перерисовки графика при изменении размеров окна. Также можно зафиксировать положение легенды относительно осей, чтобы избежать ее смещения.
Нечитаемый текст легенды из-за недостаточного контраста
Настройте цвет текста и фона легенды, чтобы обеспечить достаточный контраст. Используйте более крупные шрифты, если это необходимо.