Göstergeyi yerleştirme ( bbox_to_anchor
)
İçin bir loc
argüman kullanılarak eksenlerin sınırlayıcı kutusunun içine bir gösterge yerleştirilir plt.legend
.
Örneğin loc="upper right"
Sınırlama kutusunun sağ üst köşesinde, içinde efsanesini yerleştiren varsayılan sınırlarıyla gelen (0,0)
etmek (1,1)
eksenleri koordinatları (veya kutu gösterimi sınırlama içinde (x0,y0, width, height)=(0,0,1,1)
).
Göstergeyi eksen sınırlama kutusunun dışına yerleştirmek için, göstergenin (x0,y0)
sol alt köşesinin bir grup eksen koordinatını belirtebilirsiniz .
plt.legend(loc=(1.04,0))
Bununla birlikte, daha çok yönlü bir yaklaşım, bbox_to_anchor
argümanı kullanarak, açıklamanın yerleştirilmesi gereken sınırlayıcı kutuyu manuel olarak belirtmek olacaktır . Kişi kendini (x0,y0)
bbox'ın sadece bir kısmını tedarik edecek şekilde kısıtlayabilir. Bu, açıklamanın loc
argüman tarafından verilen yönde genişleyeceği sıfır açıklıklı bir kutu oluşturur . Örneğin
plt.legend (bbox_to_anchor = (1.04,1), loc = "sol üst")
göstergeyi, göstergenin sol üst köşesi (1.04,1)
eksen koordinatlarında olacak şekilde eksenlerin dışına yerleştirir .
Ayrıca mode
ve gibi farklı argümanlar arasındaki etkileşimin gösterildiği başka örnekler aşağıda verilmiştir 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-lü argümanı nasıl yorumlanacağı ilgili detaylar için bbox_to_anchor
, olduğu gibi l4
, bulunabilir bu soruya . Göstergeyi mode="expand"
4-demet tarafından verilen sınırlama kutusunun içinde yatay olarak genişletir. Dikey olarak genişletilmiş bir efsane için bu soruya bakın .
Bazen sınırlama kutusunu eksen koordinatları yerine şekil koordinatlarında belirtmek yararlı olabilir. Bu, göstergeyi şeklin sol alt köşesine koymak için argümanın kullanıldığı l5
yukarıdaki örnekte gösterilmiştir bbox_transform
.
Rötuş
Efsaneyi eksenlerin dışına yerleştirmek genellikle figür tuvalinin tamamen veya kısmen dışında olduğu istenmeyen duruma yol açar.
Bu sorunun çözümleri:
Alt grafik parametrelerini
ayarlama Eksenleri şekil içinde daha az yer kaplayacak (ve böylece göstergeye daha fazla alan bırakacak şekilde) alt grafik parametrelerini ayarlayabilirsiniz plt.subplots_adjust
. Örneğin
plt.subplots_adjust(right=0.7)
figürün sağ tarafında, efsaneyi yerleştirebileceği% 30 boşluk bırakır.
Sıkı düzen
Kullanma plt.tight_layout
Şekildeki öğeler şekil kenarlarına sıkıca oturacak şekilde alt grafik parametrelerini otomatik olarak ayarlamanızı sağlar. Ne yazık ki, bu otomatizmde efsane dikkate alınmaz, ancak tüm alt alanların (etiketler dahil) sığacağı bir dikdörtgen kutu sağlayabiliriz.
plt.tight_layout(rect=[0,0,0.75,1])
İle figürü kaydetmebbox_inches = "tight"
argüman bbox_inches = "tight"
için plt.savefig
rakam kaydetmek için kullanılabilir (efsane dahil) Tuval üzerine tüm sanatçı kaydedilmiş alana uygun olacak şekilde uyarlanmıştır. Gerekirse, şekil boyutu otomatik olarak ayarlanır.
plt.savefig("output.png", bbox_inches="tight")
- alt parsel parametrelerini
otomatik olarak ayarlama Alt parsel konumunu, efsane şekil boyutunu değiştirmeden tuvalin içine sığacak şekilde otomatik olarak ayarlamanın bir yolu bu cevapta bulunabilir: Tam boyutta ve dolgu içermeyen şekil oluşturma (ve eksenlerin dışında efsane)
Yukarıda tartışılan vakalar arasında karşılaştırma:
Alternatifler
Bir şekil efsanesi
Şekillere eksen yerine bir gösterge kullanılabilir matplotlib.figure.Figure.legend
. Bu, özel argümanların gerekli olmadığı matplotlib sürümü> = 2.1 için özellikle yararlı hale geldi
fig.legend(loc=7)
figürün farklı eksenlerindeki tüm sanatçılar için bir efsane yaratmak. Efsane, loc
bir eksenin içine nasıl yerleştirildiğine benzer bir argüman kullanılarak yerleştirilir, ancak tüm şekle referans olarak - bu nedenle otomatik olarak eksenlerin dışında olacaktır. Geriye kalan, alt grafikleri, efsane ve eksenler arasında çakışma olmayacak şekilde ayarlamaktır. Burada yukarıdan "Alt grafik parametrelerini ayarlayın" noktası yardımcı olacaktır. Bir örnek:
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()
Özel alt alan eksenlerinin içindeki açıklamaları
Kullanmanın bir alternatifi bbox_to_anchor
, açıklamayı özel alt alan eksenlerine ( lax
) yerleştirmek olacaktır. Gösterge alt grafiği çizimden daha küçük olması gerektiğinden gridspec_kw={"width_ratios":[4,1]}
, eksen oluşturmada kullanabiliriz . Eksenleri gizleyebiliriz, lax.axis("off")
ancak yine de bir efsane koyabiliriz. Efsane tutamaçlarının ve etiketlerinin gerçek çizimden elde edilmesi gerekir h,l = ax.get_legend_handles_labels()
ve daha sonra lax
alt grafikteki efsaneye tedarik edilebilir lax.legend(h,l)
. Tam bir örnek aşağıdadır.
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()
Bu, yukarıdaki arsaya görsel olarak oldukça benzeyen bir arsa üretir:
Efsaneyi yerleştirmek için ilk eksenleri de kullanabiliriz, ancak bbox_transform
efsane eksenlerini kullanabiliriz,
ax.legend(bbox_to_anchor=(0,0,1,1), bbox_transform=lax.transAxes)
lax.axis("off")
Bu yaklaşımda, efsane tutamaçlarını dışarıdan almamız gerekmez, ancak bbox_to_anchor
argümanı belirtmemiz gerekir .
Daha fazla okuma ve notlar:
- Efsanelerle yapmak istediğiniz diğer şeylerin bazı örneklerini içeren matplotlib efsane kılavuzunu düşünün .
- Pasta grafikler için efsaneler yerleştirmek için bazı örnek kodlar doğrudan bu sorunun cevabında bulunabilir: Python - Legend, pasta grafikle çakışıyor
loc
Argüman ancak, çok sezgisel birbirine eşlenmiş değildir, aramalar kısaltmak sayılar yerine dizeleri, alabilir. İşte referans için eşleme: