Розміщення легенди ( bbox_to_anchor
)
У межах обмежувальної коробки осей розташована легенда, використовуючи loc
аргумент до plt.legend
.
Наприклад, loc="upper right"
розміщується легенда у верхньому правому куті обмежувальної коробки, яка за замовчуванням поширюється (0,0)
на (1,1)
координати осей (або в позначення рамки (x0,y0, width, height)=(0,0,1,1)
).
Для розміщення легенди поза межами осі, що обмежує вікно, можна вказати кордон (x0,y0)
координат осей нижнього лівого кута легенди.
plt.legend(loc=(1.04,0))
Однак більш універсальним підходом було б вручну вказати обмежувальне поле, в яке слід розмістити легенду, використовуючи bbox_to_anchor
аргумент. Можна обмежити себе лише (x0,y0)
частиною скриньки. Це створює поле нульового прольоту, з якого легенда буде розширюватися у напрямку, заданому loc
аргументом. Напр
plt.legend (bbox_to_anchor = (1,04,1), loc = "верхній лівий")
розміщує легенду за межами осей, таким чином, щоб лівий верхній кут легенди був у положенні (1.04,1)
в координатах осей.
Далі наведено подальші приклади, де додатково показано взаємозв'язок між різними аргументами, як mode
і ncols
показано.
l1 = plt.legend(bbox_to_anchor=(1.04,1), borderaxespad=0)
l2 = plt.legend(bbox_to_anchor=(1.04,0), loc="lower left", borderaxespad=0)
l3 = plt.legend(bbox_to_anchor=(1.04,0.5), loc="center left", borderaxespad=0)
l4 = plt.legend(bbox_to_anchor=(0,1.02,1,0.2), loc="lower left",
mode="expand", borderaxespad=0, ncol=3)
l5 = plt.legend(bbox_to_anchor=(1,0), loc="lower right",
bbox_transform=fig.transFigure, ncol=3)
l6 = plt.legend(bbox_to_anchor=(0.4,0.8), loc="upper right")
Деталі про те, як інтерпретувати аргумент із 4-ма кордонами bbox_to_anchor
, як у l4
, можна знайти у цьому запитанні . mode="expand"
Розширює легенду горизонтально всередині прямокутника , заданий 4-кортежу. Для вертикально розширеної легенди дивіться це питання .
Іноді може бути корисним вказати обмежувальне поле у координатах фігур замість координат осей. Це показано в прикладі l5
зверху, де bbox_transform
аргумент використовується для розміщення легенди в лівому нижньому куті фігури.
Подальша обробка
Розміщення легенди поза осями часто призводить до небажаної ситуації, що вона повністю або частково знаходиться поза полотном фігури.
Рішення цієї проблеми:
Налаштування параметрів субплоти
Ви можете налаштувати параметри субплоти таким чином, щоб осі займали менше місця всередині фігури (і тим самим залишали більше місця для легенди), використовуючи plt.subplots_adjust
. Напр
plt.subplots_adjust(right=0.7)
залишає 30% місця на правій частині фігури, де можна було розмістити легенду.
Тугий макет
Використання plt.tight_layout
Дозволяє автоматично регулювати параметри субплоти, щоб елементи на рисунку щільно прилягали до країв фігури. На жаль, легенда не враховується в цьому автоматизмі, але ми можемо поставити прямокутну коробку, в яку поміститься вся область піддосів (включаючи мітки).
plt.tight_layout(rect=[0,0,0.75,1])
Збереження фігури зbbox_inches = "tight"
Аргумент , bbox_inches = "tight"
щоб plt.savefig
можна використовувати , щоб зберегти фігуру таким чином, що всі художники на полотні ( в тому числі легенди) придатні в збереженої область. При необхідності розмір фігури автоматично регулюється.
plt.savefig("output.png", bbox_inches="tight")
- автоматичне налаштування параметрів субплоти.
У цій відповіді можна знайти спосіб автоматичного регулювання положення субплату таким чином, щоб легенда вміщувалася всередину полотна, не змінюючи розмір фігури : Створення фігури з точним розміром та відсутністю прокладки (та легенди поза осями)
Порівняння між розглянутими вище випадками:
Альтернативи
Фігура Легенда
Можна використовувати умовні позначення на фігурі замість осей, matplotlib.figure.Figure.legend
. Це стало особливо корисним для версії matplotlib> = 2.1, де спеціальних аргументів не потрібно
fig.legend(loc=7)
створити легенду для всіх художників у різних осях фігури. Легенда розміщується за допомогою loc
аргументу, подібно до того, як вона розміщена всередині осей, але по відношенню до всієї фігури - значить, вона буде поза осями дещо автоматично. Залишилося налаштувати субплоти так, щоб між легендою та осями не було перекриттів. Тут корисним буде пункт "Налаштування параметрів субплоти" зверху. Приклад:
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0,2*np.pi)
colors=["#7aa0c4","#ca82e1" ,"#8bcd50","#e18882"]
fig, axes = plt.subplots(ncols=2)
for i in range(4):
axes[i//2].plot(x,np.sin(x+i), color=colors[i],label="y=sin(x+{})".format(i))
fig.legend(loc=7)
fig.tight_layout()
fig.subplots_adjust(right=0.75)
plt.show()
Легенда всередині виділених осей subplot
Альтернативою використанню bbox_to_anchor
може бути розміщення легенди у її виділених осях subplot ( lax
). Оскільки підводка легенди має бути меншою за графік, ми можемо використовувати gridspec_kw={"width_ratios":[4,1]}
при створенні осей. Ми можемо приховати вісь , lax.axis("off")
але все - таки поставити легенду. Легенда ручці і етикетки повинні отримати з реального ділянки через h,l = ax.get_legend_handles_labels()
, а потім можемо бути подані в легенду в lax
сюжетному, lax.legend(h,l)
. Повний приклад наведено нижче.
import matplotlib.pyplot as plt
plt.rcParams["figure.figsize"] = 6,2
fig, (ax,lax) = plt.subplots(ncols=2, gridspec_kw={"width_ratios":[4,1]})
ax.plot(x,y, label="y=sin(x)")
....
h,l = ax.get_legend_handles_labels()
lax.legend(h,l, borderaxespad=0)
lax.axis("off")
plt.tight_layout()
plt.show()
Це створює сюжет, який візуально дуже схожий на сюжет зверху:
Ми також могли б використовувати перші осі для розміщення легенди, але використовувати bbox_transform
осі легенди,
ax.legend(bbox_to_anchor=(0,0,1,1), bbox_transform=lax.transAxes)
lax.axis("off")
У такому підході нам не потрібно отримувати ручки легенди зовні, але нам потрібно вказати bbox_to_anchor
аргумент.
Подальше читання та примітки:
- Розгляньте посібник з легендою про matplotlib з деякими прикладами інших речей, які ви хочете зробити з легендами.
- Деякі приклади коду розміщення легенд для пирогів можна безпосередньо знайти у відповіді на це запитання: Python - Legend перекривається з круговою діаграмою
loc
Аргумент може приймати цифри замість рядка, які роблять дзвінки коротше, тим НЕ менш, вони не дуже інтуїтивно зіставляються один з одним. Ось відображення для довідки: