Saya punya plot berikut:
fig,ax = plt.subplots(5,2,sharex=True,sharey=True,figsize=fig_size)
dan sekarang saya ingin memberikan plot ini label x-axis umum dan label y-axis. Dengan "umum", maksud saya harus ada satu label sumbu x besar di bawah seluruh grid subplot, dan satu label sumbu y besar di sebelah kanan. Saya tidak dapat menemukan apa pun tentang ini di dokumentasi untukplt.subplots
, dan para googling saya menyarankan saya plt.subplot(111)
untuk memulai dengan yang besar - tetapi bagaimana saya kemudian menempatkan subplot 5 * 2 ke dalam penggunaan itu plt.subplots
?
python
matplotlib
Jolindbe
sumber
sumber
Jawaban:
Ini seperti apa yang sebenarnya Anda inginkan. Ini menerapkan pendekatan yang sama dari jawaban ini untuk kasus spesifik Anda:
sumber
plt.text
. Anda membuat subplot, tetapi kemudian menambahkan satu plot bit, membuatnya tidak terlihat, dan memberi label x dan y.tight_layout
?tight_layout
mengganti0.04
dengan0
tampaknya berfungsi.fig.text
bukanlah ide yang bagus. Ini mengacaukan hal-hal sepertiplt.tight_layout()
Karena saya menganggapnya cukup relevan dan elegan (tidak perlu menentukan koordinat untuk menempatkan teks), saya menyalin (dengan sedikit adaptasi) jawaban untuk pertanyaan terkait lainnya .
Ini menghasilkan sebagai berikut (dengan matplotlib versi 2.2.0):
sumber
constrained_layout=True
karena membuat label yang tumpang tindih. Dalam hal ini Anda harus menyesuaikan batas subplot secara manual.Tanpa
sharex=True, sharey=True
Anda dapatkan:Dengan itu Anda harus mendapatkannya lebih baik:
Tetapi jika Anda ingin menambahkan label tambahan, Anda harus menambahkannya hanya ke plot tepi:
Menambahkan label untuk setiap plot akan merusaknya (mungkin ada cara untuk secara otomatis mendeteksi label berulang, tapi saya tidak menyadarinya).
sumber
Karena perintah:
Anda menggunakan mengembalikan tuple yang terdiri dari gambar dan daftar contoh sumbu, itu sudah cukup untuk melakukan sesuatu seperti (pikiran bahwa saya telah berubah
fig,ax
menjadifig,axes
):Jika Anda ingin mengubah beberapa rincian pada subplot tertentu, Anda dapat mengaksesnya melalui
axes[i]
tempati
iterates atas subplot Anda.Mungkin juga sangat membantu untuk memasukkan a
di akhir file, sebelum
plt.show()
, untuk menghindari label yang tumpang tindih.sumber
plt.subplots()
akan membuat contoh sosok baru. Jika Anda ingin tetap dengan perintah ini, Anda dapat dengan mudah menambahkanbig_ax = fig.add_subplot(111)
, karena Anda sudah memiliki angka dan dapat menambahkan sumbu lain. Setelah itu, Anda dapat memanipulasibig_ax
cara itu ditampilkan di tautan dari Hooked.none
dengan melakukan:big_ax.set_axis_bgcolor('none')
Anda juga harus membuat warna labelnone
(sebagai lawan dari contoh yang ditautkan oleh Hooked):big_ax.tick_params(labelcolor='none', top='off', bottom='off', left='off', right='off')
AttributeError: 'numpy.ndarray' object has no attribute 'set_xlabel'
dalam pernyataanax.set_xlabel('Common x-label')
. Bisakah Anda mencari tahu?Ini akan terlihat lebih baik jika Anda menyediakan ruang untuk label umum dengan membuat label yang tidak terlihat untuk subplot di sudut kiri bawah. Juga bagus untuk mengirimkan fontsize dari rcParams. Dengan cara ini, label umum akan berubah ukuran dengan pengaturan rc Anda, dan sumbu juga akan disesuaikan untuk memberikan ruang bagi label umum.
sumber
Saya mengalami masalah yang sama saat merencanakan kotak grafik. Grafik terdiri dari dua bagian (atas dan bawah). Label-y seharusnya dipusatkan di kedua bagian.
Saya tidak ingin menggunakan solusi yang tergantung pada mengetahui posisi pada gambar luar (seperti fig.text ()), jadi saya memanipulasi posisi y dari fungsi set_ylabel (). Biasanya 0,5, di tengah plot ditambahkan. Karena padding antara bagian-bagian (hspace) dalam kode saya adalah nol, saya bisa menghitung bagian tengah dari dua bagian relatif ke bagian atas.
gambar
Kerugian:
Jarak horizontal ke plot didasarkan pada bagian atas, kutu bawah mungkin meluas ke label.
Formula tidak memperhitungkan ruang antar bagian.
Melempar pengecualian ketika ketinggian bagian atas adalah 0.
Mungkin ada solusi umum yang mempertimbangkan antara angka-angka.
sumber
Memperbarui:
Fitur ini sekarang merupakan bagian dari paket proplot matplotlib yang baru-baru ini saya rilis di pypi. Secara default, saat Anda membuat angka, label "dibagi" di antara sumbu.
Jawaban asli:
Saya menemukan metode yang lebih kuat:
Jika Anda tahu
bottom
dantop
kwarg yang masuk keGridSpec
inisialisasi, atau Anda tahu posisi tepi sumbu Anda dalamFigure
koordinat , Anda juga dapat menentukan posisi ylabel dalamFigure
koordinat dengan sihir "transformasi" yang bagus. Sebagai contoh:... dan Anda akan melihat bahwa label masih dengan tepat menyesuaikan kiri-kanan agar tidak tumpang tindih dengan label ticklabel, seperti biasa - tetapi sekarang akan menyesuaikan untuk selalu tepat di antara subplot yang diinginkan.
Selain itu, jika Anda bahkan tidak menggunakan
set_position
, ylabel akan muncul secara default tepat di tengah angka . Saya menduga ini karena ketika label akhirnya ditarik,matplotlib
menggunakan 0,5 untuk-y
koordinat tanpa memeriksa apakah transformasi koordinat yang mendasarinya telah berubah.sumber