Tingkatkan ukuran / jarak subplot dengan banyak subplot di matplotlib

313

Sangat mirip dengan pertanyaan ini tetapi dengan perbedaan bahwa figur saya dapat sebesar yang diperlukan.

Saya perlu membuat sejumlah plot yang ditumpuk secara vertikal di matplotlib. Hasilnya akan disimpan menggunakan figsave dan dilihat di halaman web, jadi saya tidak peduli seberapa tinggi gambar akhir selama subplot ditempatkan sehingga mereka tidak tumpang tindih.

Tidak peduli seberapa besar angka yang saya izinkan, subplot sepertinya selalu tumpang tindih.

Kode saya saat ini terlihat seperti

import matplotlib.pyplot as plt
import my_other_module

titles, x_lists, y_lists = my_other_module.get_data()

fig = plt.figure(figsize=(10,60))
for i, y_list in enumerate(y_lists):
    plt.subplot(len(titles), 1, i)
    plt.xlabel("Some X label")
    plt.ylabel("Some Y label")
    plt.title(titles[i])
    plt.plot(x_lists[i],y_list)
fig.savefig('out.png', dpi=100)
mcstrother
sumber

Jawaban:

413

Coba gunakan plt.tight_layout

Sebagai contoh cepat:

import matplotlib.pyplot as plt

fig, axes = plt.subplots(nrows=4, ncols=4)
fig.tight_layout() # Or equivalently,  "plt.tight_layout()"

plt.show()

Tanpa Layout Ketat

masukkan deskripsi gambar di sini


Dengan Layout Ketat masukkan deskripsi gambar di sini

Joe Kington
sumber
21
Ini akan menjadi sedikit lebih jelas jika Anda menunjukkan Anda harus menjalankan ini setelah kode plot Anda, tetapi tepat sebelum show ()
pyj
5
tight_layout()terkena dan rindu. Saya sudah mencoba untuk memahami apa yang berbeda ketika itu tidak berpengaruh (margin antar-plot besar tetap) - yang sering
javadba
3
Ini bekerja cukup baik bagi saya, kecuali itu overlay judul gambar saya ( suptitle) dengan judul subplot saya. Jika ada yang mengalami masalah serupa, inilah yang membantu dalam kasus saya stackoverflow.com/a/45161551/11740420 . Yakni, rectparametertight_layout()
Siyana Pavlova
285

Anda dapat menggunakan plt.subplots_adjustuntuk mengubah jarak antara subplot (sumber)

tanda tangan panggilan:

subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=None, hspace=None)

Arti parameter (dan standar yang disarankan) adalah:

left  = 0.125  # the left side of the subplots of the figure
right = 0.9    # the right side of the subplots of the figure
bottom = 0.1   # the bottom of the subplots of the figure
top = 0.9      # the top of the subplots of the figure
wspace = 0.2   # the amount of width reserved for blank space between subplots
hspace = 0.2   # the amount of height reserved for white space between subplots

Default aktual dikendalikan oleh file rc

CyanRook
sumber
3
Saya sudah mencoba main-main dengan hspace, tetapi meningkatkannya sepertinya membuat semua grafik lebih kecil tanpa menyelesaikan masalah yang tumpang tindih. Saya sudah mencoba bermain dengan parameter lain juga, tapi saya tidak tahu apa yang kiri, kanan, bawah, dan atas sebutkan di sana.
mcstrother
52
@ mcstrother Anda dapat secara interaktif mengubah semua 6 parameter tersebut jika Anda mengklik tombol 'penyesuaian' setelah menunjukkan plot, kemudian salin ke bawah ke kode begitu Anda menemukan yang berhasil.
Nick T
1
Saya tidak melihat tombol penyesuaian. Meskipun saya di notebook Jupyter. Saya mencoba inline% matplotlib dan% matplotlib notebook.
Matt Kleinsmith
1
@MattKleinsmith: Tombol penyesuaian memiliki teks hover "Konfigurasi subplot" dan muncul dalam penggunaan Matplotlib non-notebook biasa. Ini adalah tombol di sebelah kiri tombol simpan "floppy disk" di sini: pythonspot-9329.kxcdn.com/wp-content/uploads/2016/07/… - perhatikan tombolnya terlihat berbeda tergantung pada sistem jendela apa Anda menggunakan, tetapi selalu di sebelah kiri tombol simpan.
John Zwinck
@JohnZwinck, tautan di komentar Anda sudah mati sekarang.
user4015990
56

Saya menemukan bahwa subplots_adjust (hspace = 0.001) yang akhirnya berhasil bagi saya. Ketika saya menggunakan spasi = Tidak ada, masih ada ruang putih di antara setiap plot. Mengaturnya ke sesuatu yang sangat mendekati nol namun tampaknya memaksa mereka untuk berbaris. Apa yang saya unggah di sini bukan bagian kode yang paling elegan, tetapi Anda dapat melihat cara kerja hspace.

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.ticker as tic

fig = plt.figure()

x = np.arange(100)
y = 3.*np.sin(x*2.*np.pi/100.)

for i in range(5):
    temp = 510 + i
    ax = plt.subplot(temp)
    plt.plot(x,y)
    plt.subplots_adjust(hspace = .001)
    temp = tic.MaxNLocator(3)
    ax.yaxis.set_major_locator(temp)
    ax.set_xticklabels(())
    ax.title.set_visible(False)

plt.show()

masukkan deskripsi gambar di sini

Alexa Halford
sumber
31
import matplotlib.pyplot as plt

fig = plt.figure(figsize=(10,60))
plt.subplots_adjust( ... )

The plt.subplots_adjust Metode:

def subplots_adjust(*args, **kwargs):
    """
    call signature::

      subplots_adjust(left=None, bottom=None, right=None, top=None,
                      wspace=None, hspace=None)

    Tune the subplot layout via the
    :class:`matplotlib.figure.SubplotParams` mechanism.  The parameter
    meanings (and suggested defaults) are::

      left  = 0.125  # the left side of the subplots of the figure
      right = 0.9    # the right side of the subplots of the figure
      bottom = 0.1   # the bottom of the subplots of the figure
      top = 0.9      # the top of the subplots of the figure
      wspace = 0.2   # the amount of width reserved for blank space between subplots
      hspace = 0.2   # the amount of height reserved for white space between subplots

    The actual defaults are controlled by the rc file
    """
    fig = gcf()
    fig.subplots_adjust(*args, **kwargs)
    draw_if_interactive()

atau

fig = plt.figure(figsize=(10,60))
fig.subplots_adjust( ... )

Ukuran gambar itu penting.

"Saya sudah mencoba mengotak-atik hspace, tetapi meningkatkannya sepertinya membuat semua grafik lebih kecil tanpa menyelesaikan masalah yang tumpang tindih."

Dengan demikian untuk membuat lebih banyak ruang putih dan menjaga ukuran sub plot total gambar harus lebih besar.

Demz
sumber
2
Ukuran gambar penting, ukuran gambar yang lebih besar dapat menyelesaikan masalah ini! set plt.figure(figsize=(10, 7)), ukuran gambar akan menjadi 2000 x 1400pix
Belter
20

Mirip dengan tight_layoutmatplotlib sekarang (pada versi 2.2) menyediakan constrained_layout. Berbeda dengan tight_layout, yang dapat dipanggil kapan saja dalam kode untuk tata letak tunggal yang dioptimalkan, constrained_layoutadalah properti, yang mungkin aktif dan akan mengoptimalkan tata letak sebelum setiap langkah menggambar.

Oleh karena itu perlu diaktifkan sebelum atau selama pembuatan subplot, seperti figure(constrained_layout=True)atau subplots(constrained_layout=True).

Contoh:

import matplotlib.pyplot as plt

fig, axes = plt.subplots(4,4, constrained_layout=True)

plt.show()

masukkan deskripsi gambar di sini

constrained_layout mungkin juga diatur melalui rcParams

plt.rcParams['figure.constrained_layout.use'] = True

Lihat entri apa yang baru dan Panduan Tata Letak yang Dibatasi

ImportanceOfBeingErnest
sumber
1
akan mencoba ini: belum melihat opsi ini - dan tight_layouttidak dapat diandalkan
javadba
ini kedengarannya menjanjikan tetapi tidak memberi saya jarak yang cukup (label dan judul kapak masih tumpang tindih) dan proses rendering lebih lama. tight_layout()bekerja lebih baik
craq
2
@craq Benar, secara umum contrained_layoutlebih lambat, karena seperti yang terlihat dalam jawaban ini, ini mengoptimalkan tata letak sebelum setiap langkah menggambar .
ImportanceOfBeingErnest
bagi saya ini adalah jawaban yang paling berguna - tight_layout bagi saya selalu meningkatkan jarak vertikal untuk meninggalkan ruang untuk judul panel, tetapi dengan biaya memotong label sumbu y setiap kali. Ini, sebagai gantinya, bekerja dengan sempurna, terima kasih.
Adrian Tompkins