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

Molly
quelle
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:

apdnu
quelle
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:

.

Herpes-freier Ingenieur
quelle
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

CT Zhu
quelle
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)
Michel de Ruiter
quelle