Saya akrab dengan pertanyaan-pertanyaan berikut:
Matplotlib savefig dengan legenda di luar plot
Cara mengeluarkan legenda dari plot
Tampaknya jawaban dalam pertanyaan-pertanyaan ini memiliki kemewahan untuk bisa bermain-main dengan penyusutan sumbu yang tepat sehingga legenda cocok.
Mengecilkan sumbu, bagaimanapun, bukanlah solusi yang ideal karena membuat data lebih kecil sehingga sebenarnya lebih sulit untuk ditafsirkan; terutama ketika kompleks dan ada banyak hal yang terjadi ... maka perlu legenda besar
Contoh legenda kompleks dalam dokumentasi menunjukkan perlunya hal ini karena legenda dalam plot mereka benar-benar mengaburkan beberapa titik data.
http://matplotlib.sourceforge.net/users/legend_guide.html#legend-of-complex-plots
Apa yang ingin saya lakukan adalah secara dinamis memperluas ukuran kotak gambar untuk mengakomodasi legenda angka yang sedang berkembang.
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(-2*np.pi, 2*np.pi, 0.1)
fig = plt.figure(1)
ax = fig.add_subplot(111)
ax.plot(x, np.sin(x), label='Sine')
ax.plot(x, np.cos(x), label='Cosine')
ax.plot(x, np.arctan(x), label='Inverse tan')
lgd = ax.legend(loc=9, bbox_to_anchor=(0.5,0))
ax.grid('on')
Perhatikan bagaimana label akhir 'Inverse tan' sebenarnya di luar kotak gambar (dan terlihat sangat terpotong - bukan kualitas publikasi!)
Akhirnya, saya telah diberitahu bahwa ini adalah perilaku normal dalam R dan LaTeX, jadi saya sedikit bingung mengapa ini sangat sulit dengan python ... Apakah ada alasan historis? Apakah Matlab sama-sama miskin dalam hal ini?
Saya memiliki (hanya sedikit) versi yang lebih panjang dari kode ini di pastebin http://pastebin.com/grVjc007
sumber
tight_layout()
harus diubah untuk memperhitungkan legenda.Jawaban:
Maaf EMS, tapi saya sebenarnya hanya mendapat respons lain dari daftar mailling matplotlib (Terima kasih keluar untuk Benjamin Root).
Kode yang saya cari adalah menyesuaikan panggilan savefig ke:
Ini tampaknya mirip dengan memanggil tight_layout, tetapi sebaliknya Anda mengizinkan savefig untuk mempertimbangkan artis tambahan dalam perhitungan. Ini memang mengubah ukuran kotak gambar seperti yang diinginkan.
Ini menghasilkan:
[Sunting] Maksud dari pertanyaan ini adalah untuk sepenuhnya menghindari penggunaan penempatan koordinat sewenang-wenang dari teks sewenang-wenang seperti solusi tradisional untuk masalah ini. Meskipun demikian, banyak suntingan baru-baru ini bersikeras menempatkan ini, sering dengan cara yang menyebabkan kode meningkatkan kesalahan. Saya sekarang telah memperbaiki masalah dan merapikan teks arbitrer untuk menunjukkan bagaimana ini juga dipertimbangkan dalam algoritma bbox_extra_artists.
sumber
plt.show()
. Adakah perbaikan untuk itu?fig.legend()
metode , benar-benar aneh.Ditambahkan: Saya menemukan sesuatu yang harus melakukan trik segera, tetapi sisa kode di bawah ini juga menawarkan alternatif.
Gunakan
subplots_adjust()
fungsi ini untuk memindahkan bagian bawah subplot ke atas:Kemudian mainkan dengan offset di bagian legenda
bbox_to_anchor
dari perintah legenda, untuk mendapatkan kotak legenda di tempat yang Anda inginkan. Beberapa kombinasi pengaturanfigsize
dan penggunaansubplots_adjust(bottom=...)
harus menghasilkan plot kualitas untuk Anda.Alternatif: Saya cukup mengubah baris:
untuk:
dan berubah
untuk
dan itu muncul dengan baik di layar saya (monitor CRT 24 inci).
Di sini
figsize=(M,N)
mengatur jendela gambar menjadi M inci demi N inci. Mainkan saja ini sampai terlihat cocok untuk Anda. Konversikan ke format gambar yang lebih skalabel dan gunakan GIMP untuk mengedit jika perlu, atau potong saja denganviewport
opsi LaTeX saat menyertakan gambar.sumber
Berikut ini adalah solusi lain yang sangat manual. Anda dapat menentukan ukuran sumbu dan bantalan dianggap sesuai (termasuk legenda dan tanda centang). Semoga bermanfaat bagi seseorang.
Contoh (ukuran sumbu sama!):
Kode:
sumber
plt.draw()
menjadiax.figure.canvas.draw()
. Saya tidak yakin mengapa, tetapi sebelum perubahan ini ukuran legenda tidak diperbarui.fig.set_size_inches(widthTot,heightTot)
untukfig.set_size_inches(widthTot,heightTot, forward=True)
.