Wie entferne ich Lücken zwischen Unterplots in matplotlib?


116

Der folgende Code erzeugt Lücken zwischen den Unterplots. Wie entferne ich die Lücken zwischen den Unterplots und mache das Bild zu einem engen Raster?

Geben Sie hier die Bildbeschreibung ein

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
poste einen Link und er kann in bearbeitet werden. Er Nonetut nicht das, was du denkst, sondern bedeutet "Standard verwenden".
Tacaswell

Ich habe versucht, Zahlen anstelle von "Keine" hinzuzufügen, aber dies hat das Prolem nicht gelöst.
user3006135

4
plt.subplots_adjust(wspace=0, hspace=0)würde Ihr Problem lösen, wenn Sie nicht 'equal'Aspekt verwenden. Siehe meine Antwort für Details.
Apdnu

Antworten:


100

Mit gridspec können Sie den Abstand zwischen den Achsen steuern. Hier finden Sie weitere Informationen .

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

Achsen sehr nahe beieinander


35
Es ist nicht beschränkt auf GridSpec, wenn Sie die Figur bei der Erstellung greifen, können Sie die Entfernungen auch einstellen mit:fig.subplots_adjust(hspace=, wspace=)
Rutger Kassies

3
Was bedeutet die letzte Zeile in der forSchleife?
Ciprian Tomoiagă

Dies ist ein sehr schöner Tipp, der aber nicht verwendet wird subplots. Diese Antwort erledigt die Arbeit ohne Einbußen subplots.
Wizclown

Gibt es eine Möglichkeit, den horizontalen Abstand nur zwischen der ersten und der zweiten Achsenreihe zu entfernen ?
Stefano

135

Das Problem ist die Verwendung von aspect='equal' , die verhindert, dass sich die Unterzeichnungen auf ein beliebiges Seitenverhältnis ausdehnen und den gesamten leeren Raum ausfüllen.

Normalerweise würde dies funktionieren:

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)

Das Ergebnis ist folgendes:

Mit, aspect='equal'wie im folgenden Code:

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)

Das bekommen wir:

Der Unterschied in diesem zweiten Fall besteht darin, dass Sie die x- und y-Achse gezwungen haben, die gleiche Anzahl von Einheiten / Pixel zu haben. Da die Achsen standardmäßig von 0 auf 1 gehen (dh bevor Sie etwas zeichnen), verwenden Sieaspect='equal' erzwingt die , dass jede Achse ein Quadrat ist. Da die Figur kein Quadrat ist, fügt Pyplot einen zusätzlichen Abstand zwischen den Achsen horizontal hinzu.

Um dieses Problem zu umgehen, können Sie Ihre Figur auf das richtige Seitenverhältnis einstellen. Wir werden hier die objektorientierte Pyplot-Schnittstelle verwenden, die ich im Allgemeinen für überlegen halte:

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)

Hier ist das Ergebnis:


3
Vielen Dank! Ihre Antwort ist einfach und funktioniert perfekt. plt.subplots_adjust(wspace=0, hspace=0)
MohamedEzz

35

Ohne auf Gridspec vollständig zurückzugreifen, kann Folgendes auch verwendet werden, um die Lücken zu entfernen, indem wspace und hspace auf Null gesetzt werden:

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

Ergebend:

.


4

Hast du es versucht plt.tight_layout()?

mit plt.tight_layout() Geben Sie hier die Bildbeschreibung ein ohne es: Geben Sie hier die Bildbeschreibung ein

Oder: so etwas (verwenden 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]))

Wenn Sie keine Achsen teilen müssen, dann einfach axLS=map(fig.add_axes, rectLS) Geben Sie hier die Bildbeschreibung ein


Ich habe versucht, ein enges Layout zu erstellen, aber es hat die Lücken nicht beseitigt, was ich will. Die Gridspec-Lösung hat funktioniert. Vielen Dank für die Vorschläge.
user3006135

Dies funktionierte hervorragend in Verbindung mit den anderen Vorschlägen. tight_layout () half dabei, den Leerraum über und an den Seiten des Plots zu entfernen, der keinen Zweck hatte.
DChaps

0

In neueren matplotlib-Versionen möchten Sie möglicherweise Constrained Layout ausprobieren . Dies funktioniert jedoch nicht plt.subplot(), daher müssen Sie plt.subplots()stattdessen Folgendes verwenden :

fig, axs = plt.subplots(4, 4, constrained_layout=True)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.