Matplotlib'de alt noktalar arasındaki boşluklar nasıl kaldırılır?


116

Aşağıdaki kod, alt noktalar arasında boşluklar oluşturur. Alt noktalar arasındaki boşlukları nasıl kaldırabilirim ve resmi sıkı bir ızgara haline getirebilirim?

görüntü açıklamasını buraya girin

import matplotlib.pyplot as plt

for i in range(16):
    i = i + 1
    ax1 = plt.subplot(4, 4, i)
    plt.axis('on')
    ax1.set_xticklabels([])
    ax1.set_yticklabels([])
    ax1.set_aspect('equal')
    plt.subplots_adjust(wspace=None, hspace=None)
plt.show()

2
bir bağlantı gönderin ve içinde düzenlenebilir. Nonedüşündüğünüzü yapmıyor, 'varsayılanı kullan' anlamına geliyor.
tacaswell

'Yok' yerine sayı eklemeyi denedim ama bu sorunu çözmedi.
user3006135

4
plt.subplots_adjust(wspace=0, hspace=0)'equal'veçheyi kullandığın gerçeği olmasaydı problemini çözecekti . Ayrıntılar için cevabıma bakın.
apdnu

Yanıtlar:


100

Eksenler arasındaki aralığı kontrol etmek için gridspec'i kullanabilirsiniz . Burada daha fazla bilgi var.

import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec

plt.figure(figsize = (4,4))
gs1 = gridspec.GridSpec(4, 4)
gs1.update(wspace=0.025, hspace=0.05) # set the spacing between axes. 

for i in range(16):
   # i = i + 1 # grid spec indexes from 0
    ax1 = plt.subplot(gs1[i])
    plt.axis('on')
    ax1.set_xticklabels([])
    ax1.set_yticklabels([])
    ax1.set_aspect('equal')

plt.show()

eksenler birbirine çok yakın


35
Bununla sınırlı değil GridSpec, figürü yaratılırken fig.subplots_adjust(hspace=, wspace=)
yakalarsanız

3
fordöngüdeki son satır ne anlama geliyor?
Ciprian Tomoiagă

Bu çok güzel bir ipucu ama işe yaramıyor subplots. Bu cevap işi feda etmeden halleder subplots.
wizclown

Yalnızca birinci ve ikinci eksen sıraları arasındaki yatay aralığı kaldırmanın bir yolu var mı ?
Stefano

136

Sorun, aspect='equal'alt planların keyfi bir en-boy oranına uzanmasını ve tüm boş alanı doldurmasını engelleyen kullanımıdır .

Normalde bu işe yarar:

import matplotlib.pyplot as plt

ax = [plt.subplot(2,2,i+1) for i in range(4)]

for a in ax:
    a.set_xticklabels([])
    a.set_yticklabels([])

plt.subplots_adjust(wspace=0, hspace=0)

Sonuç şudur:

Bununla birlikte, aspect='equal'aşağıdaki kodda olduğu gibi:

import matplotlib.pyplot as plt

ax = [plt.subplot(2,2,i+1) for i in range(4)]

for a in ax:
    a.set_xticklabels([])
    a.set_yticklabels([])
    a.set_aspect('equal')

plt.subplots_adjust(wspace=0, hspace=0)

Biz bunu elde ederiz:

Bu ikinci durumdaki fark, x ve y eksenlerini aynı sayıda birim / piksele sahip olmaya zorlamış olmanızdır. Eksenler varsayılan olarak 0'dan 1'e gittiğinden (yani, herhangi bir şeyi çizmeden önce), aspect='equal'her ekseni bir kare olmaya zorlar. Şekil bir kare olmadığından, pyplot yatay olarak eksenler arasına fazladan boşluk ekler.

Bu sorunu aşmak için, figürünüzü doğru en boy oranına sahip olacak şekilde ayarlayabilirsiniz. Burada genel olarak daha üstün olduğunu düşündüğüm nesne yönelimli pyplot arayüzünü kullanacağız:

import matplotlib.pyplot as plt

fig = plt.figure(figsize=(8,8)) # Notice the equal aspect ratio
ax = [fig.add_subplot(2,2,i+1) for i in range(4)]

for a in ax:
    a.set_xticklabels([])
    a.set_yticklabels([])
    a.set_aspect('equal')

fig.subplots_adjust(wspace=0, hspace=0)

İşte sonuç:


3
Teşekkürler! cevabınız basit ve mükemmel çalışıyor. plt.subplots_adjust(wspace=0, hspace=0)
MohamedEzz

36

Başvurmadan gridspec tamamen aşağıdakiler de ayarlayarak boşlukları çıkarmak için kullanılabilecek wspace ve hspace sıfıra:

import matplotlib.pyplot as plt

plt.clf()
f, axarr = plt.subplots(4, 4, gridspec_kw = {'wspace':0, 'hspace':0})

for i, ax in enumerate(f.axes):
    ax.grid('on', linestyle='--')
    ax.set_xticklabels([])
    ax.set_yticklabels([])

plt.show()
plt.close()

Sonuçlanan:

.


4

Denedin plt.tight_layout()mi

ile plt.tight_layout() görüntü açıklamasını buraya girin onsuz: görüntü açıklamasını buraya girin

Veya: bunun gibi bir şey (kullanın add_axes)

left=[0.1,0.3,0.5,0.7]
width=[0.2,0.2, 0.2, 0.2]
rectLS=[]
for x in left:
   for y in left:
       rectLS.append([x, y, 0.2, 0.2])
axLS=[]
fig=plt.figure()
axLS.append(fig.add_axes(rectLS[0]))
for i in [1,2,3]:
     axLS.append(fig.add_axes(rectLS[i],sharey=axLS[-1]))    
axLS.append(fig.add_axes(rectLS[4]))
for i in [1,2,3]:
     axLS.append(fig.add_axes(rectLS[i+4],sharex=axLS[i],sharey=axLS[-1]))
axLS.append(fig.add_axes(rectLS[8]))
for i in [5,6,7]:
     axLS.append(fig.add_axes(rectLS[i+4],sharex=axLS[i],sharey=axLS[-1]))     
axLS.append(fig.add_axes(rectLS[12]))
for i in [9,10,11]:
     axLS.append(fig.add_axes(rectLS[i+4],sharex=axLS[i],sharey=axLS[-1]))

Eksenleri paylaşmanız gerekmiyorsa, axLS=map(fig.add_axes, rectLS) görüntü açıklamasını buraya girin


Sıkı düzeni denedim ama boşluklardan kurtulamadı, istediğim de bu. Gridspec çözümü işe yaradı. Öneriler için teşekkürler.
user3006135

Bu, diğer önerilerle birlikte harika çalıştı. tight_layout (), arsanın üstündeki ve herhangi bir amaca hizmet etmeyen yanlarındaki beyaz boşluğun kaldırılmasına yardımcı oldu.
DC

0

Son matplotlib sürümleriyle, Kısıtlı Yerleşimi denemek isteyebilirsiniz . plt.subplot()Ancak bu işe yaramaz , plt.subplots()bunun yerine şunu kullanmanız gerekir :

fig, axs = plt.subplots(4, 4, constrained_layout=True)
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.