Umieszczanie legendy ( bbox_to_anchor
)
Legenda jest umieszczana wewnątrz obwiedni osi za pomocą loc
argumentu do plt.legend
.
Np. loc="upper right"
Umieszcza legendę w prawym górnym rogu ramki ograniczającej, która domyślnie rozciąga się od (0,0)
do (1,1)
współrzędnych osi (lub w notacji ramki ograniczającej (x0,y0, width, height)=(0,0,1,1)
).
Aby umieścić legendę poza obwiednią osi, można określić krotkę (x0,y0)
współrzędnych osi lewego dolnego rogu legendy.
plt.legend(loc=(1.04,0))
Jednak bardziej uniwersalnym podejściem byłoby ręczne określenie ramki granicznej, w której legenda powinna zostać umieszczona, za pomocą bbox_to_anchor
argumentu. Można ograniczyć się do dostarczania tylko (x0,y0)
części skrzynki. Tworzy to pole zerowego zakresu, z którego legenda będzie się rozwijać w kierunku podanym przez loc
argument. Na przykład
plt.legend (bbox_to_anchor = (1.04,1), loc = "lewy górny róg")
umieszcza legendę poza osiami, tak aby lewy górny róg legendy był ustawiony (1.04,1)
we współrzędnych osi.
Dalsze przykłady podano poniżej, gdzie dodatkowo pokazano wzajemne oddziaływanie różnych argumentów, takich jak mode
i 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")
Szczegółowe informacje na temat interpretacji argumentu 4-krotnego bbox_to_anchor
, podobnie jak w l4
, można znaleźć w tym pytaniu . mode="expand"
Rozszerza legendę poziomo wewnątrz obwiedni określonej przez 4-krotnego. W przypadku legendy rozwiniętej pionowo zobacz to pytanie .
Czasami może być przydatne określenie ramki granicznej we współrzędnych figury zamiast we współrzędnych osi. Jest to pokazane w l5
powyższym przykładzie , w którym bbox_transform
argument jest używany do umieszczenia legendy w lewym dolnym rogu figury.
Przetwarzanie końcowe
Umieszczenie legendy poza osiami często prowadzi do niepożądanej sytuacji, że jest ona całkowicie lub częściowo poza płótnem postaci.
Rozwiązaniami tego problemu są:
Dostosuj parametry podplotu
Można tak dostosować parametry podplotu, aby osie zajmowały mniej miejsca wewnątrz figury (a tym samym pozostawiły więcej miejsca legendzie) za pomocą plt.subplots_adjust
. Na przykład
plt.subplots_adjust(right=0.7)
pozostawia 30% miejsca po prawej stronie figury, gdzie można umieścić legendę.
Ciasny układ
Używanie plt.tight_layout
Umożliwia automatyczne dostosowanie parametrów wykresu podrzędnego, tak aby elementy na figurze ściśle przylegały do krawędzi figury. Niestety, legenda nie jest brana pod uwagę w tym automatyzmie, ale możemy dostarczyć prostokątne pudełko, w które zmieści się cały obszar podplotów (w tym etykiety).
plt.tight_layout(rect=[0,0,0.75,1])
Zapisywanie figury za pomocąbbox_inches = "tight"
Argumentu, bbox_inches = "tight"
za plt.savefig
pomocą którego można zapisać figurę, tak aby wszyscy artyści na płótnie (w tym legenda) byli dopasowani do zapisanego obszaru. W razie potrzeby wielkość figury jest automatycznie dostosowywana.
plt.savefig("output.png", bbox_inches="tight")
- automatyczne dostosowywanie parametrów wykresu podrzędnego
Sposób na automatyczne dopasowanie położenia wykresu podrzędnego tak, aby legenda mieściła się w obszarze roboczym bez zmiany rozmiaru figury, można znaleźć w tej odpowiedzi: Tworzenie figury z dokładnym rozmiarem i bez dopełnienia (i legenda poza osiami)
Porównanie przypadków omówionych powyżej:
Alternatywy
Postać legenda
One mogą wykorzystywać legendę do figury zamiast z osi matplotlib.figure.Figure.legend
. Stało się to szczególnie przydatne w wersji matplotlib> = 2.1, gdzie nie są potrzebne żadne specjalne argumenty
fig.legend(loc=7)
stworzyć legendę dla wszystkich artystów w różnych osiach figury. Legenda jest umieszczana za pomocą loc
argumentu, podobnie jak jest umieszczona w osiach, ale w odniesieniu do całej figury - stąd będzie nieco automatycznie poza osiami. Pozostaje tak wyregulować wykresy podrzędne, aby legenda i osie nie zachodziły na siebie. W tym przypadku pomocny będzie punkt „Dostosuj parametry podplotu” z góry. Przykład:
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()
Legenda w dedykowanych osiach podplotu
Alternatywą dla użycia bbox_to_anchor
byłoby umieszczenie legendy w dedykowanych osiach podplotu ( lax
). Ponieważ podplot legendy powinien być mniejszy niż wykres, możemy go wykorzystać gridspec_kw={"width_ratios":[4,1]}
przy tworzeniu osi. Możemy ukryć osie lax.axis("off")
ale nadal umieścić legendę w. Uchwyty legenda i etykiety muszą uzyskać od rzeczywistej działce pośrednictwem h,l = ax.get_legend_handles_labels()
, a następnie może być dostarczony do legendy w lax
poletko, lax.legend(h,l)
. Pełny przykład znajduje się poniżej.
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()
To tworzy wykres, który jest wizualnie bardzo podobny do wykresu z góry:
Możemy również użyć pierwszych osi do umieszczenia legendy, ale użyj bbox_transform
osi legendy,
ax.legend(bbox_to_anchor=(0,0,1,1), bbox_transform=lax.transAxes)
lax.axis("off")
W tym podejściu nie musimy uzyskiwać uchwytów legendy zewnętrznie, ale musimy podać bbox_to_anchor
argument.
Dalsza lektura i notatki:
- Rozważ przewodnik po matplotlib z kilkoma przykładami innych rzeczy, które chcesz robić z legendami.
- Przykładowy kod do umieszczania legend dla wykresów kołowych można znaleźć bezpośrednio w odpowiedzi na to pytanie: Python - Legenda pokrywa się z wykresem kołowym
loc
Argument może wziąć numery zamiast strun, które sprawiają, że rozmowy krótszy, jednak nie są one bardzo intuicyjnie odwzorowywane na siebie. Oto mapowanie w celach informacyjnych: