Один общий легенд для множества subplots в Matplotlib
Быстрый ответ
Для создания общей легенды для нескольких подграфиков следует использовать метод fig.legend()
, предварительно получив элементы графика и их наименования. Вот простой пример для двух подграфиков (ax1
, ax2
) с применением библиотеки matplotlib
:
import matplotlib.pyplot as plt
# Создаём подграфики и отображаем данные с подписями
fig, (ax1, ax2) = plt.subplots(1, 2)
ax1.plot([1, 2, 3], label="Линия 1")
ax2.plot([3, 2, 1], label="Линия 2")
# Получаем элементы легенды и располагаем общую легенду справа от графиков
handles, labels = zip(*(ax.get_legend_handles_labels() for ax in [ax1, ax2]))
fig.legend(handles, labels, loc='center right')
plt.show()
Приведенный код объединит элементы легенд подграфиков ax1
и ax2
и расположит их справа.
Пошаговое руководство по созданию общей легенды
Сбор элементов легенды
Первый шаг в создании общей легенды – это сбор всех значков и подписей с подграфиков. Можно использовать цикл for
или генератор списка. Предположим, что у нас есть n подграфиков:
handles, labels = [], []
for ax in fig.get_axes():
h, l = ax.get_legend_handles_labels()
handles.extend(h)
labels.extend(l)
Определение положения легенды
В контексте pyplot
подойдет следующий способ:
handles, labels = plt.gca().get_legend_handles_labels()
Но fig.legend()
предоставляет больше возможностей для контроля. Используйте параметры bbox_to_anchor
и bbox_transform
для точного размещения легенды вне графиков:
fig.legend(handles, labels, loc='upper left', bbox_to_anchor=(1, 1), bbox_transform=plt.gcf().transFigure)
Увеличивайте размер изображения для исключения наложения легенды на графики.
Когда используются объединенные оси
Если вы объединяете оси с помощью twinx()
, вам нужно будет объединить элементы обеих осей:
ax2 = ax1.twinx()
handles1, labels1 = ax1.get_legend_handles_labels()
handles2, labels2 = ax2.get_legend_handles_labels()
handles, labels = handles1 + handles2, labels1 + labels2
Удаление отдельных легенд
После добавления общей легенды следует скрыть отдельные легенды подграфиков:
for ax in fig.get_axes():
ax.legend().set_visible(False)
Обеспечение визуального единообразия
Для сохранения общего стиля всех линий на различных подграфиках используйте одинаковые параметры color
и linestyle
или настройте axes.prop_cycle
в plt.rcParams
.
Правильное время для добавления легенды
Добавляйте вашу общую легенду после настройки размера фигуры, но перед вызовом метода fig.tight_layout()
, чтобы избежать обрезания элементов.
Визуализация
Воспринимайте подграфики как некую серию кадров в фильме. Легенда выполняет роль рассказчика, соединяющего кадры воедино:
Подграфики — это кадры фильма
|-- 🍿 Кадр А
|-- 🍿 Кадр Б
|-- 🍿 Кадр В
Легенда объединяет их в цельную историю:
Единая легенда (Рассказчик)
|-- 🔵 Синий: "Линия 1" в кадрах А, Б
|-- 🔺 Красный: "Линия 2" в кадрах А, В
|-- ⬛ Черный: "И так далее..." в кадре Б
Игра цветов и форм на подграфиках усиливает общее впечатление, а точная настройка делает изображение понятным.
Создание подграфиков для лучшего повествования
Не бойтесь экспериментировать с подграфиками, используя, например, метод add_subplot()
. Общую легенду располагайте вне цикла создания подграфиков.
Заключительные штрихи: заголовок
Украсьте вашу визуализацию, добавив общий заголовок через fig.suptitle
и правильно расположив легенду с использованием параметров bbox_to_anchor
и loc
.
Полезные материалы
- matplotlib.legend — Материалы по Matplotlib 3.8.2 — Подробная информация о размещении и настройке легенды.
- Создание подграфиков с помощью plt.subplots — Материалы по Matplotlib 3.8.2 — Обширное руководство по работе с подграфиками.
- Примеры легенд — Материалы по Matplotlib 3.8.2 — Примеры оформления легенды.
- Настройка легенд в графиках | Руководство по науке о данных в Python — Советы по расположению и выравниванию легенды.
- Руководство по Matplotlib на Python – Real Python — Глубокое погружение в создание графиков.
- Размеры изображений для подграфиков — Материалы по Matplotlib 3.8.2 — Работа с размерами фигур.