Menempatkan legenda ( bbox_to_anchor
)
Legenda diposisikan di dalam kotak pembatas dari sumbu menggunakan loc
argumen untuk plt.legend
.
Misalnya loc="upper right"
menempatkan legenda di sudut kanan atas kotak pembatas, yang secara default meluas dari (0,0)
ke (1,1)
dalam koordinat sumbu (atau dalam notasi pembatas kotak (x0,y0, width, height)=(0,0,1,1)
).
Untuk menempatkan legenda di luar kotak pembatas sumbu, seseorang dapat menentukan tupel (x0,y0)
koordinat sumbu dari sudut kiri bawah legenda.
plt.legend(loc=(1.04,0))
Namun, pendekatan yang lebih fleksibel adalah dengan menentukan secara manual kotak pembatas di mana legenda harus ditempatkan, menggunakan bbox_to_anchor
argumen. Seseorang dapat membatasi diri hanya untuk memasok (x0,y0)
bagian dari bbox. Ini menciptakan kotak rentang nol, di mana legenda akan berkembang ke arah yang diberikan oleh loc
argumen. Misalnya
plt.legend (bbox_to_anchor = (1.04,1), loc = "kiri atas")
menempatkan legenda di luar sumbu, sehingga sudut kiri atas legenda berada pada posisi (1.04,1)
dalam koordinat sumbu.
Contoh lebih lanjut diberikan di bawah ini, di mana tambahan interaksi antara argumen yang berbeda seperti mode
dan ncols
ditampilkan.
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")
Rincian tentang bagaimana menafsirkan argumen 4-tuple bbox_to_anchor
, seperti pada l4
, dapat ditemukan dalam pertanyaan ini . The mode="expand"
memperluas legenda horizontal dalam kotak berlari diberikan oleh 4-tupel. Untuk legenda yang diperluas secara vertikal, lihat pertanyaan ini .
Kadang-kadang mungkin berguna untuk menentukan kotak pembatas dalam koordinat angka, bukan koordinat sumbu. Ini ditunjukkan dalam contoh l5
dari atas, di mana bbox_transform
argumen digunakan untuk meletakkan legenda di sudut kiri bawah gambar.
Pengolahan pasca
Setelah menempatkan legenda di luar sumbu sering mengarah pada situasi yang tidak diinginkan bahwa itu sepenuhnya atau sebagian di luar kanvas gambar.
Solusi untuk masalah ini adalah:
Menyesuaikan parameter subplot
Seseorang dapat menyesuaikan parameter subplot sedemikian rupa, sehingga sumbu mengambil lebih sedikit ruang di dalam gambar (dan dengan demikian meninggalkan lebih banyak ruang untuk legenda) dengan menggunakan plt.subplots_adjust
. Misalnya
plt.subplots_adjust(right=0.7)
menyisakan 30% ruang di sisi kanan gambar, di mana orang bisa menempatkan legenda.
Tata letak yang ketat
Menggunakan plt.tight_layout
Memungkinkan untuk secara otomatis menyesuaikan parameter subplot sedemikian rupa sehingga elemen-elemen pada gambar berada pada tepi gambar. Sayangnya, legenda tersebut tidak diperhitungkan dalam otomatisme ini, tetapi kami dapat menyediakan kotak persegi panjang yang dapat digunakan oleh seluruh area subplot (termasuk label).
plt.tight_layout(rect=[0,0,0.75,1])
Menyimpan gambar denganbbox_inches = "tight"
Argumen bbox_inches = "tight"
untuk plt.savefig
dapat digunakan untuk menyimpan gambar sedemikian rupa sehingga semua artis di kanvas (termasuk legenda) masuk ke dalam area yang disimpan. Jika perlu, ukuran gambar disesuaikan secara otomatis.
plt.savefig("output.png", bbox_inches="tight")
- secara otomatis menyesuaikan parplot subplot
Cara untuk menyesuaikan posisi subplot secara otomatis sehingga legenda pas di dalam kanvas tanpa mengubah ukuran gambar dapat ditemukan dalam jawaban ini: Membuat gambar dengan ukuran tepat dan tanpa bantalan (dan legenda di luar sumbu)
Perbandingan antara kasus-kasus yang dibahas di atas:
Alternatif
Legenda figur
Seseorang dapat menggunakan legenda untuk figur alih-alih sumbu matplotlib.figure.Figure.legend
,. Ini menjadi sangat berguna untuk versi matplotlib> = 2.1, di mana tidak ada argumen khusus yang diperlukan
fig.legend(loc=7)
untuk menciptakan legenda bagi semua seniman di sumbu yang berbeda dari gambar. Legenda ditempatkan menggunakan loc
argumen, mirip dengan bagaimana ia ditempatkan di dalam sumbu, tetapi mengacu pada keseluruhan gambar - maka itu akan berada di luar sumbu agak otomatis. Yang tersisa adalah menyesuaikan subplot sehingga tidak ada tumpang tindih antara legenda dan sumbu. Di sini titik "Sesuaikan parameter subplot" dari atas akan sangat membantu. Sebuah contoh:
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 di dalam kapak subplot khusus
Alternatif untuk menggunakan bbox_to_anchor
adalah menempatkan legenda dalam kapak subplot khusus ( lax
). Karena subplot legenda harus lebih kecil dari plot, kita dapat menggunakan gridspec_kw={"width_ratios":[4,1]}
pada pembuatan sumbu. Kita dapat menyembunyikan sumbu lax.axis("off")
tetapi masih memasukkan legenda. Legenda menangani dan label perlu diperoleh dari plot nyata melalui h,l = ax.get_legend_handles_labels()
, dan kemudian dapat dipasok ke legenda di lax
subplot lax.legend(h,l)
,. Contoh lengkapnya ada di bawah ini.
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()
Ini menghasilkan plot yang secara visual sangat mirip dengan plot dari atas:
Kita juga bisa menggunakan kapak pertama untuk menempatkan legenda, tetapi gunakan bbox_transform
kapak legenda,
ax.legend(bbox_to_anchor=(0,0,1,1), bbox_transform=lax.transAxes)
lax.axis("off")
Dalam pendekatan ini, kita tidak perlu mendapatkan gagang legenda secara eksternal, tetapi kita perlu menentukan bbox_to_anchor
argumennya.
Bacaan dan catatan lebih lanjut:
- Pertimbangkan panduan legenda matplotlib dengan beberapa contoh hal lain yang ingin Anda lakukan dengan legenda.
- Beberapa contoh kode untuk menempatkan legenda untuk diagram lingkaran dapat langsung ditemukan sebagai jawaban atas pertanyaan ini: Python - Legenda tumpang tindih dengan diagram lingkaran
- The
loc
Argumen dapat mengambil angka bukan string, yang membuat panggilan pendek, namun, mereka tidak sangat intuitif dipetakan ke satu sama lain. Berikut adalah pemetaan untuk referensi: