Matplotlib'deki birçok alt grafikle alt grafik boyutunu / aralığını iyileştirin


313

Bu soruya çok benziyor ama farkımla figürüm olması gerektiği kadar büyük olabilir.

Matplotlib'de bir yığın dikey olarak yığılmış araziler oluşturmam gerekiyor. Sonuç figsave kullanılarak kaydedilecek ve bir web sayfasında görüntülenecektir, bu yüzden alt grafikler aralıklı olduğu sürece son görüntünün ne kadar uzun olduğu umurumda değil.

Rakamın ne kadar büyük olmasına izin verirsem, alt grafikler her zaman örtüşüyor gibi görünüyor.

Kodum şu anda benziyor

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)

Yanıtlar:


413

Kullanmayı deneyin plt.tight_layout

Kısa bir örnek olarak:

import matplotlib.pyplot as plt

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

plt.show()

Sıkı Düzen Olmadan

resim açıklamasını buraya girin


Sıkı Düzenli resim açıklamasını buraya girin


21
Bunu, çizim kodunuzdan sonra yürütmeniz gerektiğini gösterirseniz, ancak show ()
pyj

5
tight_layout()vuruldu ve özledim. Etkisi olmadığında neyin farklı olduğunu anlamaya çalışıyorum (büyük
arsalar

3
Bu benim için oldukça iyi çalıştı, sadece suptitlebenim alt başlık ile şekil başlığımı ( ) overlaid . Herhangi birinin benzer bir sorunla karşılaşması durumunda, davamda yardımcı olan şey stackoverflow.com/a/45161551/11740420 . Yani,recttight_layout()
Siyana Pavlova

284

plt.subplots_adjustAlt grafikler (kaynak) arasındaki boşluğu değiştirmek için kullanabilirsiniz

çağrı imzası:

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

Parametre anlamları (ve önerilen varsayılanlar):

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

Gerçek varsayılanlar rc dosyası tarafından kontrol edilir


3
Ben hspace ile uğraşmayı denedim, ama artan sadece örtüşme sorunu çözmeden tüm grafikleri daha küçük yapmak gibi görünüyor. Diğer parametrelerle de oynamayı denedim, ancak sol, sağ, alt ve üst kısımların aslında orada ne belirlediğini bilmiyorum.
mcstrother

52
Bir çizim gösterdikten sonra 'ayarlama' düğmesine tıklarsanız, ardından neyin işe yaradığını bulduktan sonra bunları koda kopyalarsanız, bu parametrelerin 6'sını etkileşimli olarak değiştirebilirsiniz.
Nick T

1
Bir ayar düğmesi görmüyorum. Jupyter not defterinde olmasına rağmen. % Matplotlib satır içi ve% matplotlib not defterini denedim.
Matt Kleinsmith

1
@MattKleinsmith: Ayar düğmesinin üzerinde "Alt grafikleri yapılandır" vurgulu metni bulunur ve Matplotlib'in dizüstü bilgisayar dışındaki düzenli kullanımlarında görünür. Buradaki "disket" kaydet düğmesinin solundaki düğme: pythonspot-9329.kxcdn.com/wp-content/uploads/2016/07/… - düğmenin hangi pencere sistemine bağlı olarak farklı göründüğüne dikkat edin kullanın, ancak her zaman kaydet düğmesinin solundadır.
John Zwinck

@ JohnZwinck, yorumunuzdaki bağlantı şimdi öldü.
user4015990

56

Ben subplots_adjust (hspace = 0.001) benim için sonuçlanan olduğunu buldum. Space = None kullandığımda, her çizim arasında hala beyaz boşluk var. Ancak sıfıra çok yakın bir şeye ayarlamak onları sıraya sokmaya zorlamaktadır. Burada yüklediğim en zarif kod parçası değil, ancak hspace'in nasıl çalıştığını görebilirsiniz.

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()

resim açıklamasını buraya girin


31
import matplotlib.pyplot as plt

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

Plt.subplots_adjust yöntemi:

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()

veya

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

Resmin boyutu önemlidir.

"Hspace ile uğraşmayı denedim, ancak bunu artırmak, çakışma sorununu çözmeden tüm grafikleri küçülüyor gibi görünüyor."

Böylece daha fazla beyaz alan açmak ve alt çizim boyutunu korumak için toplam görüntünün daha büyük olması gerekir.


2
Resmin boyutu önemlidir, daha büyük resim boyutu bu sorunu çözebilir! set plt.figure(figsize=(10, 7)), resmin boyutu 2000 x 1400pix olur
Belter


20

tight_layoutŞimdi matplotlib benzer (sürüm 2.2 itibariyle) sağlar constrained_layout. Buna karşılık tight_layout, tek bir optimize edilmiş düzen için kodda herhangi bir zamanda çağrılabilen constrained_layout, aktif olabilecek ve her çizim adımından önce düzeni optimize edecek bir özelliktir.

Bu nedenle, figure(constrained_layout=True)veya gibi alt grafik oluşturma öncesinde veya sırasında etkinleştirilmesi gerekir subplots(constrained_layout=True).

Misal:

import matplotlib.pyplot as plt

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

plt.show()

resim açıklamasını buraya girin

constrained_layout da üzerinden ayarlanabilir rcParams

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

Bkz ne yeni bir giriş ve Kısıtlı Düzeni Rehberi


1
bu deneyecek: bu seçeneği görmemişti - ve tight_layoutgüvenilmez
javadba

bu umut vericiydi ama bana yeterince boşluk vermedi (eksen etiketleri ve başlıklar hala çakışıyor) ve render işlemi çok daha uzun sürdü. tight_layout()daha iyi çalıştı
craq

2
@craq Doğru, genel contrained_layoutolarak daha yavaştır, çünkü bu cevapta görüldüğü gibi, her çizim adımından önce mizanpajı optimize eder .
ImportanceOfBeingErnest

benim için bu en yararlı cevaptı - tight_layout benim için her zaman panel başlığı için yer bırakmak için dikey aralığı geliştirir, ancak her seferinde y ekseni etiketini kesme pahasına. Bu, bunun yerine, mükemmel çalışıyor, teşekkürler.
Adrian Tompkins
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.