НейроАгент

Как разместить легенду вне графика в Matplotlib

Полное руководство по размещению легенд вне областей графиков в Matplotlib. Узнайте, как размещать легенды справа и уменьшать размер шрифта для компактных, профессиональных визуализаций данных.

Вопрос

Как разместить легенду вне области построения в визуализации данных

Я создаю фигуру с 20 отдельными графиками (не подграфиками) и мне нужно разместить легенду вне области построения справа. Я хочу сохранить текущий размер фигуры, не уменьшая размеры осей.

Конкретно, мне нужна помощь с:

  1. Как разместить рамку легенды вне области построения, конкретно справа
  2. Методы уменьшения размера шрифта в легенде для более компактной рамки легенды
НейроАгент

Размещение легенды справа от области графика в Matplotlib

Чтобы разместить легенду справа от области графика в Matplotlib, используйте параметр bbox_to_anchor с координатами, такими как (1.1, 1), и комбинируйте его с параметром loc='upper right', чтобы закрепить легенду за пределами границ графика. Для уменьшения размера шрифта легенды используйте параметр fontsize в функции legend(), чтобы сделать блок легенды более компактным, сохраняя текущий размер фигуры.

Содержание


Базовый метод размещения легенды справа

Наиболее прямой подход к размещению легенды справа от области графика включает использование параметра bbox_to_anchor в сочетании с параметром loc. Этот метод позволяет точно контролировать положение легенды относительно границ графика.

Использование bbox_to_anchor и loc

Основные параметры, которые вам понадобятся:

  • bbox_to_anchor: кортеж (x, y), указывающий точку привязки относительно осей
  • loc: строка, указывающая, где должна располагаться легенда относительно точки привязки

Для позиционирования справа распространенные комбинации включают:

python
plt.legend(loc='upper right', bbox_to_anchor=(1.1, 1))

Это размещает верхний правый угол легенды на 110% ширины осей (x=1.1) и 100% высоты осей (y=1), эффективно позиционируя ее справа от области графика.

Понимание системы координат

Система координат для bbox_to_anchor работает следующим образом:

  • (0, 0) соответствует нижнему левому углу осей
  • (1, 1) соответствует верхнему правому углу осей
  • Значения, большие 1, выходят за пределы осей
  • Значения, меньшие 0,延伸到 осей влево или вниз

Для идеального центрирования легенды справа можно использовать:

python
plt.legend(loc='center left', bbox_to_anchor=(1, 0.5))

Это позиционирует центр легенды на правом краю графика (x=1) и по вертикали по центру (y=0.5).

Продвинутые методы позиционирования

Для более сложных сценариев с несколькими графиками или точными требованиями к позиционированию можно использовать несколько продвинутых методов.

Использование fig.legend() для общих легенд

При работе с несколькими графиками, которые имеют общие записи легенды, использование fig.legend() более эффективно, чем создание отдельных легенд для каждого графика:

python
fig, ax = plt.subplots()
ax.plot([1, 2, 3], label='Линия 1')
ax.plot([3, 2, 1], label='Линия 2')

# Создание общей легенды вне всех графиков
fig.legend(loc='outside upper right', bbox_to_anchor=(1.1, 1))
plt.tight_layout()

Как объясняется в официальной документации Matplotlib, fig.legend() создает легенду, которая может быть общей для нескольких подграфиков или осей.

Корректировка макета с помощью tight_layout()

Чтобы гарантировать, что легенда не перекрывает другие элементы и область графика остается правильно sized, используйте tight_layout():

python
plt.legend(loc='upper right', bbox_to_anchor=(1.1, 1))
plt.tight_layout(rect=[0, 0, 0.9, 1])  # Оставить место справа

Параметр rect указывает прямоугольник, в пределах которого нужно настроить график, позволяя зарезервировать место для легенды.

Точная настройка положения легенды

Для точного позиционирования можно экспериментировать с разными значениями координат:

python
# Различные варианты позиционирования справа
plt.legend(loc='upper right', bbox_to_anchor=(1.15, 1))      # Дальше вправо
plt.legend(loc='center right', bbox_to_anchor=(1.2, 0.5))    # Центрировано справа, дальше от графика
plt.legend(loc='lower right', bbox_to_anchor=(1.05, 0))      # Внизу справа

Согласно руководству GeeksforGeeks, параметр bbox_to_anchor=(1.1, 1) особенно эффективен для размещения легенды в верхнем правом углу за пределами области графика.

Уменьшение размера шрифта легенды для компактного отображения

При размещении легенды за пределами области графика, особенно в фигурах с несколькими графиками, уменьшение размера шрифта может помочь создать более компактную и читаемую легенду.

Использование параметра fontsize

Самый простой способ уменьшить размер шрифта легенды - использовать параметр fontsize:

python
plt.legend(loc='upper right', bbox_to_anchor=(1.1, 1), fontsize='small')

Общие варианты размера шрифта включают:

  • 'xx-small', 'x-small', 'small', 'medium', 'large', 'x-large', 'xx-large'
  • Числовые значения (например, fontsize=8, fontsize=10)
  • Относительные размеры (например, fontsize=0.8)

Установка разных размеров шрифта для заголовка и меток легенды

Для более детального контроля можно установить разные размеры шрифта для заголовка легенды и отдельных меток:

python
legend = plt.legend(loc='upper right', bbox_to_anchor=(1.1, 1))
legend.get_title().set_fontsize('medium')    # Заголовок легенды
for text in legend.get_texts():
    text.set_fontsize('small')                 # Метки легенды

Использование параметра prop для свойств шрифта

Для еще большего контроля над внешним видом шрифта используйте параметр prop:

python
plt.legend(loc='upper right', bbox_to_anchor=(1.1, 1), 
          prop={'size': 8, 'family': 'sans-serif'})

Как упоминается в руководстве PSYCHOLOGICAL STATISTICS, Matplotlib предоставляет комплексные параметры настройки шрифта через различные аргументы в функции legend().

Работа с несколькими графиками и легендами

При работе с 20 отдельными графиками, как упоминалось в вашем вопросе, вам понадобятся стратегии для эффективного управления легендами без перегрузки визуализации.

Создание единой общей легенды

Для графиков, которые имеют общие ряды данных, создайте единую общую легенду:

python
fig, axes = plt.subplots(4, 5, figsize=(20, 16))  # Сетка 4x5 для 20 графиков

# Отрисовка данных на каждой оси с одинаковыми метками
for i, ax in enumerate(axes.flat):
    ax.plot([1, 2, 3], label='Ряд A')
    ax.plot([3, 2, 1], label='Ряд B')
    ax.set_title(f'График {i+1}')

# Создание одной общей легенды
fig.legend(loc='outside upper right', bbox_to_anchor=(1.1, 1))
plt.tight_layout()

Позиционирование легенды для нескольких макетов фигур

Для разных макетов фигур корректируйте позиционирование соответственно:

python
# Для горизонтального расположения графиков
fig, axes = plt.subplots(1, 20, figsize=(40, 3))
for i, ax in enumerate(axes):
    ax.plot([1, 2, 3], label=f'Данные {i+1}')

# Позиционирование легенды под графиками
fig.legend(loc='outside center right', bbox_to_anchor=(1.1, 0.5))
plt.tight_layout()

Блог Saturn Cloud предлагает, что корректировка правого параметра в tight_layout() может помочь разместить легенду за пределами области графика справа.

Полный пример с кодом

Вот полный пример, демонстрирующий, как разместить легенду справа от области графика с уменьшенным размером шрифта:

python
import matplotlib.pyplot as plt
import numpy as np

# Создание примера данных
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)

# Создание фигуры и графика
fig, ax = plt.subplots(figsize=(10, 6))
ax.plot(x, y1, label='Синусоида', linewidth=2)
ax.plot(x, y2, label='Косинусоида', linewidth=2, linestyle='--')

# Позиционирование легенды справа с уменьшенным размером шрифта
legend = ax.legend(
    loc='center left', 
    bbox_to_anchor=(1.05, 0.5),  # Справа, по центру по вертикали
    fontsize='small',            # Уменьшенный размер шрифта
    frameon=True,                # Добавить рамку
    fancybox=True,               # Скругленные углы
    shadow=True                  # Добавить тень
)

# Корректировка макета для размещения легенды
plt.tight_layout(rect=[0, 0, 0.85, 1])  # Оставить место справа

# Добавление заголовка и меток
ax.set_title('Тригонометрические функции с внешней легендой')
ax.set_xlabel('Ось X')
ax.set_ylabel('Ось Y')
ax.grid(True, alpha=0.3)

plt.show()

Этот пример создает профессионально выглядящий график с легендой, расположенной справа, и использует меньший размер шрифта для сохранения компактности легенды.

Устранение распространенных проблем

При размещении легенды за пределами области графика вы можете столкнуться с несколькими распространенными проблемами:

Легенда обрезается

Если часть вашей легенды обрезается, скорректируйте параметры макета:

python
plt.tight_layout(rect=[0, 0, 0.9, 1])  # Увеличить правое поле

Сообщество Better Stack подтверждает, что (1, 1) размещает легенду в верхнем правом углу за пределами области графика, но необходима корректировка макета для предотвращения обрезания.

Легенда перекрывает другие элементы

Используйте bbox_inches='tight' при сохранении фигур:

python
plt.savefig('график_с_легендой.png', bbox_inches='tight')

Легенда не реагирует на изменения размера шрифта

Если изменения размера шрифта не применяются, попробуйте обновить легенду после создания:

python
legend = plt.legend(loc='upper right', bbox_to_anchor=(1.1, 1))
for text in legend.get_texts():
    text.set_fontsize(8)

Источники

  1. How to put the legend outside the plot - Stack Overflow
  2. Legend guide — Matplotlib 3.10.7 documentation
  3. How to Place Legend Outside of the Plot in Matplotlib? - GeeksforGeeks
  4. How to Put the Legend outside the Plot | Better Stack Community
  5. How to Place the Legend Outside the Plot in Matplotlib | Built In
  6. Enhancing Data Visualization: Moving Legends Outside the Plot with Matplotlib in Python | Saturn Cloud Blog
  7. Python 🐍 Put Legend Outside Plot 📈 – Easy Guide – Be …
  8. Add a Title to Matplotlib Legend (With Examples) - PSYCHOLOGICAL STATISTICS

Заключение

Основные моменты для размещения легенды за пределами области графика справа:

  1. Используйте параметр bbox_to_anchor с координатами, большими 1 (например, (1.1, 1)), для позиционирования легенды за пределами границ графика
  2. Комбинируйте с параметром loc для контроля выравнивания относительно точки привязки
  3. Уменьшайте размер шрифта легенды с помощью параметра fontsize или путем индивидуального обновления свойств текста легенды
  4. Всегда используйте tight_layout() для предотвращения перекрытия легенды и обеспечения правильного расстояния
  5. Для нескольких графиков рассмотрите возможность использования fig.legend() для создания общих легенд, экономящих место

Для вашего конкретного случая с 20 отдельными графиками я рекомендую создать общую легенду с помощью fig.legend() с уменьшенным размером шрифта и позиционировать ее с помощью bbox_to_anchor=(1.05, 0.5) для оптимального размещения справа. Экспериментируйте с разными размерами шрифта и значениями координат, чтобы достичь идеального баланса между читаемостью и компактностью.