Saya merencanakan jenis informasi yang sama, tetapi untuk negara yang berbeda, dengan banyak subplot dengan matplotlib. Yaitu, saya memiliki 9 plot pada kisi 3x3, semuanya dengan garis yang sama (tentu saja, nilai yang berbeda per baris).
Namun, saya belum menemukan cara untuk menempatkan legenda tunggal (karena semua 9 subplot memiliki garis yang sama) pada gambar sekali saja.
Bagaimana aku melakukan itu?
python
matplotlib
pocketfullofcheese
sumber
sumber
handles, labels = [(a + b) for a, b in zip(ax1.get_legend_handles_labels(), ax2.get_legend_handles_labels())]
figlegend mungkin yang Anda cari: http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.figlegend
Contoh di sini: http://matplotlib.org/examples/pylab_examples/figlegend_demo.html
Contoh lain:
atau:
sumber
lines
variabel untuk dimasukkan ke dalam argumenlegend
?lines
adalah daftar hasil yang dikembalikan dariaxes.plot()
(yaitu, setiapaxes.plot
rutin atau serupa mengembalikan "baris"). Lihat juga contoh terkait.Untuk penentuan posisi otomatis sebuah legenda tunggal dalam
figure
dengan banyak sumbu, seperti yang diperoleh dengansubplots()
, solusi berikut berfungsi dengan sangat baik:Dengan
bbox_to_anchor
danbbox_transform=plt.gcf().transFigure
Anda menentukan kotak pembatas baru dari ukuran Andafigure
untuk menjadi referensiloc
. Menggunakan(0,-0.1,1,1)
gerakan kotak bouding ini sedikit ke bawah untuk mencegah legenda ditempatkan di atas seniman lain.OBS: gunakan solusi ini SETELAH Anda gunakan
fig.set_size_inches()
dan SEBELUM Anda gunakanfig.tight_layout()
sumber
loc='upper center', bbox_to_anchor=(0.5, 0), bbox_transform=plt.gcf().transFigure
dan itu tidak akan tumpang tindih pasti.Anda hanya perlu meminta legenda sekali, di luar lingkaran Anda.
Misalnya, dalam hal ini saya punya 4 subplot, dengan garis yang sama, dan satu legenda.
sumber
figlegend
, seperti yang disarankan oleh Evert, tampaknya menjadi solusi yang jauh lebih baik;)fig.legend()
adalah bahwa itu memerlukan identifikasi untuk semua garis (plot) ... karena, untuk setiap subplot, saya menggunakan loop untuk menghasilkan garis, satu-satunya solusi yang saya cari untuk mengatasinya adalah dengan membuat daftar kosong sebelum loop kedua, dan kemudian tambahkan baris saat sedang dibuat ... Lalu saya menggunakan daftar ini sebagai argumen untukfig.legend()
fungsi.dados
disanadados
adalah dataset dari file netCDF4 (untuk setiap file yang ditentukan dalam daftarficheiros
). Di setiap loop, file yang berbeda dibaca dan subplot ditambahkan ke gambar.Saya perhatikan bahwa tidak ada jawaban yang menampilkan gambar dengan legenda tunggal yang mereferensikan banyak kurva di berbagai subplot, jadi saya harus menunjukkan satu ... untuk membuat Anda penasaran ...
Sekarang, Anda ingin melihat kodenya, bukan?
Dua garis
pantas mendapat penjelasan - untuk tujuan ini saya telah merangkum bagian yang sulit dalam suatu fungsi, hanya 4 baris kode tetapi banyak berkomentar
PS Saya tahu itu
sum(list_of_lists, [])
adalah metode yang sangat tidak efisien untuk meratakan daftar daftar tetapi love Saya suka kekompakannya, ② biasanya beberapa kurva di beberapa subplot dan ③ Matplotlib dan efisiensi? ;-)sumber
Meskipun agak terlambat ke permainan, saya akan memberikan solusi lain di sini karena ini masih salah satu tautan pertama yang muncul di google. Menggunakan matplotlib 2.2.2, ini dapat dicapai dengan menggunakan fitur gridspec. Pada contoh di bawah, tujuannya adalah untuk memiliki empat sub-plot yang disusun secara 2x2 dengan legenda yang ditunjukkan di bagian bawah. Sumbu 'palsu' dibuat di bagian bawah untuk menempatkan legenda di tempat tetap. Sumbu 'palsu' kemudian dimatikan sehingga hanya legenda yang ditampilkan. Hasil: https://i.stack.imgur.com/5LUWM.png .
sumber
jika Anda menggunakan subplot dengan diagram batang, dengan warna berbeda untuk setiap batang. mungkin lebih cepat untuk membuat artefak yang Anda gunakan sendiri
mpatches
Katakanlah Anda memiliki empat batang dengan warna berbeda karena
r
m
c
k
Anda dapat mengatur legenda sebagai berikutsumber
plt.legend
ke memiliki satu legenda untuk semua subplot sayahandles, _ = plt.gca().get_legend_handles_labels()
fig.legend(handles, labels)
Jawaban ini adalah pelengkap dari @ Evert pada posisi legenda.
Percobaan pertama saya pada solusi @ Evert gagal karena tumpang tindih dari legenda dan judul subplot.
Bahkan, tumpang tindih disebabkan oleh
fig.tight_layout()
, yang mengubah tata letak subplot tanpa mempertimbangkan legenda gambar. Namun,fig.tight_layout()
itu perlu.Untuk menghindari tumpang tindih, kita dapat memberitahu
fig.tight_layout()
untuk meninggalkan ruang untuk legenda tokoh olehfig.tight_layout(rect=(0,0,1,0.9))
.Deskripsi parameter tight_layout () .
sumber
Untuk membangun di atas jawaban @ gboffi dan Ben Usman:
Dalam situasi di mana seseorang memiliki garis yang berbeda di subplot yang berbeda dengan warna dan label yang sama, orang dapat melakukan sesuatu di sepanjang garis
sumber