Что такое легенда и зачем она нужна?
Легенда в Matplotlib — это ключевой элемент визуализации данных, который позволяет идентифицировать, какие графики или элементы соответствуют каким данным. Она особенно важна, когда на одном графике представлено несколько наборов данных, функций или категорий. Без легенды интерпретация графика становится затруднительной, а порой и невозможной.
Легенда обеспечивает:
- Ясность: Помогает читателю понять, что отображает каждая линия, столбец или маркер на графике.
- Удобство: Позволяет быстро сопоставить визуальные элементы с их соответствующими данными.
- Профессионализм: Делает графики более презентабельными и понятными для широкой аудитории.
Основы создания легенды в Matplotlib
Создать простую легенду в Matplotlib очень легко. Обычно, для этого достаточно добавить параметр label при построении графика и затем вызвать функцию plt.legend().
import matplotlib.pyplot as plt
import numpy as np
# Данные
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)
# Построение графиков с метками
plt.plot(x, y1, label='sin(x)')
plt.plot(x, y2, label='cos(x)')
# Добавление легенды
plt.legend()
# Отображение графика
plt.show()
В этом примере label присваивает имя каждому графику, а plt.legend() автоматически создает и отображает легенду на графике.
Размещение легенды за пределами графика: основные способы
Стандартное размещение легенды внутри графика может перекрывать важные данные. Matplotlib предоставляет несколько способов вынести легенду за пределы области построения.
Использование bboxtoanchor для точного позиционирования
Параметр bbox_to_anchor функции plt.legend() позволяет точно указать положение легенды относительно осей графика. Он принимает кортеж (x, y), где x и y — координаты точки привязки легенды. Значения координат задаются во fractions относительно размеров осей (axes). Значение (0, 0) соответствует левому нижнему углу, а (1, 1) – правому верхнему. loc определяет какая точка легенды привязывается к координатам bbox_to_anchor.
Размещение легенды справа от графика
Чтобы разместить легенду справа от графика, можно использовать bbox_to_anchor=(1.05, 1) и loc='upper left'. Это поместит левый верхний угол рамки легенды чуть правее правого верхнего угла графика. Необходимо предусмотреть дополнительное место справа от графика, иначе легенда будет обрезана.
import matplotlib.pyplot as plt
import numpy as np
# Данные
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)
# Построение графиков
plt.plot(x, y1, label='sin(x)')
plt.plot(x, y2, label='cos(x)')
# Размещение легенды справа
plt.legend(loc='upper left', bbox_to_anchor=(1.05, 1))
# Отображение графика
plt.show()
Размещение легенды снизу графика
Аналогично, для размещения легенды снизу, можно использовать bbox_to_anchor=(0.5, -0.05) и loc='upper center'. Это поместит верхнюю центральную точку рамки легенды чуть ниже центра нижней границы графика. Как и в предыдущем случае, убедитесь, что снизу достаточно места.
Продвинутые техники размещения легенды
Использование GridSpec для сложной компоновки графиков и легенд
Для более сложного управления размещением легенды можно использовать GridSpec. Это позволяет создать сетку, в которой можно разместить графики и легенду в определенных ячейках.
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.gridspec as gridspec
# Создание сетки
gs = gridspec.GridSpec(2, 2, width_ratios=[3, 1])
fig = plt.figure()
# Создание осей для графика
ax1 = fig.add_subplot(gs[:, 0])
# Данные
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)
# Построение графиков
ax1.plot(x, y1, label='sin(x)')
ax1.plot(x, y2, label='cos(x)')
# Создание осей для легенды
ax2 = fig.add_subplot(gs[0, 1])
ax3 = fig.add_subplot(gs[1, 1])
ax2.axis('off') # Отключаем оси у легенды
ax3.axis('off') # Отключаем оси у легенды
# Размещение легенды
ax1.legend(loc='center left', bbox_to_anchor=(1, 0.5))
# Отображение графика
plt.tight_layout()
plt.show()
В этом примере GridSpec создает сетку 2×2, где график занимает три ячейки слева, а легенда — одну ячейку справа. Это позволяет точно контролировать положение легенды относительно графика.
Автоматическое размещение легенды вне графика: plt.tight_layout()
Функция plt.tight_layout() автоматически корректирует параметры расположения подграфиков, чтобы они помещались в область фигуры. Она может помочь избежать перекрытия легенды и других элементов графика.
import matplotlib.pyplot as plt
import numpy as np
# Данные
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)
# Построение графиков
plt.plot(x, y1, label='sin(x)')
plt.plot(x, y2, label='cos(x)')
# Размещение легенды справа
plt.legend(loc='center left', bbox_to_anchor=(1, 0.5))
# Автоматическая корректировка расположения
plt.tight_layout()
# Отображение графика
plt.show()
Решение распространенных проблем
Перекрытие легендой данных графика
Убедитесь, что положение легенды не перекрывает важные данные. Используйте bbox_to_anchor для точного позиционирования или рассмотрите возможность размещения легенды вне графика.
Некорректное отображение элементов легенды
Проверьте, что метки графиков (label) заданы правильно и соответствуют отображаемым данным. Убедитесь, что в легенде отображаются все необходимые элементы.
Легенда обрезается при сохранении графика
При сохранении графика убедитесь, что область сохранения достаточно велика, чтобы вместить легенду. Используйте plt.savefig(..., bbox_inches='tight') для автоматической корректировки границ сохранения.
Примеры кода и лучшие практики
Пример 1: Размещение легенды справа с настройкой внешнего вида
import matplotlib.pyplot as plt
import numpy as np
# Данные
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)
# Построение графиков
plt.plot(x, y1, label='sin(x)')
plt.plot(x, y2, label='cos(x)')
# Настройка внешнего вида легенды
plt.legend(loc='upper left', bbox_to_anchor=(1.05, 1), borderaxespad=0., frameon=False)
# Добавление заголовка
plt.title('Графики синуса и косинуса')
# Отображение графика
plt.show()
В этом примере легенда размещена справа, убран фон рамки (frameon=False), и добавлен отступ от осей (borderaxespad=0.).
Пример 2: Использование bboxtoanchor для точного контроля
import matplotlib.pyplot as plt
import numpy as np
# Данные
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)
# Построение графиков
plt.plot(x, y1, label='sin(x)')
plt.plot(x, y2, label='cos(x)')
# Точное позиционирование легенды
plt.legend(loc='lower right', bbox_to_anchor=(0.95, 0.05), ncol=2)
# Отображение графика
plt.show()
Здесь bbox_to_anchor используется для размещения легенды в правом нижнем углу с небольшим отступом, а ncol=2 располагает элементы легенды в два столбца.
Рекомендации по улучшению читаемости графиков с внешними легендами
- Используйте контрастные цвета: Убедитесь, что цвета линий и элементов легенды хорошо различимы.
- Настраивайте размер шрифта: Сделайте текст легенды достаточно крупным, чтобы его было легко читать.
- Указывайте единицы измерения: Если данные имеют единицы измерения, укажите их в легенде или подписях осей.
- Следуйте принципу KISS: Чем проще и понятнее график, тем лучше. Избегайте излишней информации и визуальных элементов.