Как разместить легенду вне области построения в визуализации данных
Я создаю фигуру с 20 отдельными графиками (не подграфиками) и мне нужно разместить легенду вне области построения справа. Я хочу сохранить текущий размер фигуры, не уменьшая размеры осей.
Конкретно, мне нужна помощь с:
- Как разместить рамку легенды вне области построения, конкретно справа
- Методы уменьшения размера шрифта в легенде для более компактной рамки легенды
Размещение легенды справа от области графика в 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: строка, указывающая, где должна располагаться легенда относительно точки привязки
Для позиционирования справа распространенные комбинации включают:
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,延伸到 осей влево или вниз
Для идеального центрирования легенды справа можно использовать:
plt.legend(loc='center left', bbox_to_anchor=(1, 0.5))
Это позиционирует центр легенды на правом краю графика (x=1) и по вертикали по центру (y=0.5).
Продвинутые методы позиционирования
Для более сложных сценариев с несколькими графиками или точными требованиями к позиционированию можно использовать несколько продвинутых методов.
Использование fig.legend() для общих легенд
При работе с несколькими графиками, которые имеют общие записи легенды, использование fig.legend() более эффективно, чем создание отдельных легенд для каждого графика:
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():
plt.legend(loc='upper right', bbox_to_anchor=(1.1, 1))
plt.tight_layout(rect=[0, 0, 0.9, 1]) # Оставить место справа
Параметр rect указывает прямоугольник, в пределах которого нужно настроить график, позволяя зарезервировать место для легенды.
Точная настройка положения легенды
Для точного позиционирования можно экспериментировать с разными значениями координат:
# Различные варианты позиционирования справа
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:
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)
Установка разных размеров шрифта для заголовка и меток легенды
Для более детального контроля можно установить разные размеры шрифта для заголовка легенды и отдельных меток:
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:
plt.legend(loc='upper right', bbox_to_anchor=(1.1, 1),
prop={'size': 8, 'family': 'sans-serif'})
Как упоминается в руководстве PSYCHOLOGICAL STATISTICS, Matplotlib предоставляет комплексные параметры настройки шрифта через различные аргументы в функции legend().
Работа с несколькими графиками и легендами
При работе с 20 отдельными графиками, как упоминалось в вашем вопросе, вам понадобятся стратегии для эффективного управления легендами без перегрузки визуализации.
Создание единой общей легенды
Для графиков, которые имеют общие ряды данных, создайте единую общую легенду:
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()
Позиционирование легенды для нескольких макетов фигур
Для разных макетов фигур корректируйте позиционирование соответственно:
# Для горизонтального расположения графиков
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() может помочь разместить легенду за пределами области графика справа.
Полный пример с кодом
Вот полный пример, демонстрирующий, как разместить легенду справа от области графика с уменьшенным размером шрифта:
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()
Этот пример создает профессионально выглядящий график с легендой, расположенной справа, и использует меньший размер шрифта для сохранения компактности легенды.
Устранение распространенных проблем
При размещении легенды за пределами области графика вы можете столкнуться с несколькими распространенными проблемами:
Легенда обрезается
Если часть вашей легенды обрезается, скорректируйте параметры макета:
plt.tight_layout(rect=[0, 0, 0.9, 1]) # Увеличить правое поле
Сообщество Better Stack подтверждает, что (1, 1) размещает легенду в верхнем правом углу за пределами области графика, но необходима корректировка макета для предотвращения обрезания.
Легенда перекрывает другие элементы
Используйте bbox_inches='tight' при сохранении фигур:
plt.savefig('график_с_легендой.png', bbox_inches='tight')
Легенда не реагирует на изменения размера шрифта
Если изменения размера шрифта не применяются, попробуйте обновить легенду после создания:
legend = plt.legend(loc='upper right', bbox_to_anchor=(1.1, 1))
for text in legend.get_texts():
text.set_fontsize(8)
Источники
- How to put the legend outside the plot - Stack Overflow
- Legend guide — Matplotlib 3.10.7 documentation
- How to Place Legend Outside of the Plot in Matplotlib? - GeeksforGeeks
- How to Put the Legend outside the Plot | Better Stack Community
- How to Place the Legend Outside the Plot in Matplotlib | Built In
- Enhancing Data Visualization: Moving Legends Outside the Plot with Matplotlib in Python | Saturn Cloud Blog
- Python 🐍 Put Legend Outside Plot 📈 – Easy Guide – Be …
- Add a Title to Matplotlib Legend (With Examples) - PSYCHOLOGICAL STATISTICS
Заключение
Основные моменты для размещения легенды за пределами области графика справа:
- Используйте параметр
bbox_to_anchorс координатами, большими 1 (например,(1.1, 1)), для позиционирования легенды за пределами границ графика - Комбинируйте с параметром
locдля контроля выравнивания относительно точки привязки - Уменьшайте размер шрифта легенды с помощью параметра
fontsizeили путем индивидуального обновления свойств текста легенды - Всегда используйте
tight_layout()для предотвращения перекрытия легенды и обеспечения правильного расстояния - Для нескольких графиков рассмотрите возможность использования
fig.legend()для создания общих легенд, экономящих место
Для вашего конкретного случая с 20 отдельными графиками я рекомендую создать общую легенду с помощью fig.legend() с уменьшенным размером шрифта и позиционировать ее с помощью bbox_to_anchor=(1.05, 0.5) для оптимального размещения справа. Экспериментируйте с разными размерами шрифта и значениями координат, чтобы достичь идеального баланса между читаемостью и компактностью.