Warum verwenden viele Beispiele "fig, ax = plt.subplots ()" in Matplotlib / pyplot / python?

265

Ich lerne das Verwenden, matplotlibindem ich Beispiele studiere, und viele Beispiele scheinen eine Linie wie die folgende zu enthalten, bevor ich eine einzelne Handlung erstelle ...

fig, ax = plt.subplots()

Hier sind einige Beispiele...

Ich sehe, dass diese Funktion häufig verwendet wird, obwohl im Beispiel nur versucht wird, ein einzelnes Diagramm zu erstellen. Gibt es noch einen anderen Vorteil? Die offizielle Demo für wird subplots()auch f, ax = subplotsbeim Erstellen eines einzelnen Diagramms verwendet und verweist danach nur noch auf ax. Dies ist der Code, den sie verwenden.

# Just a figure and one subplot
f, ax = plt.subplots()
ax.plot(x, y)
ax.set_title('Simple plot')
neelshiv
quelle
11
Nun, es ist kurz, prägnant und Sie erhalten in einem einzigen Schritt eine Referenz für zwei Figuren und Achsen. Es ist pythonisch, weil es schön ist :)
Cel

Antworten:

322

plt.subplots()ist eine Funktion, die ein Tupel zurückgibt, das eine Figur und Achsenobjekte enthält. Wenn fig, ax = plt.subplots()Sie also verwenden, entpacken Sie dieses Tupel in die Variablen figund ax. Haben figist nützlich, wenn Sie Attribute auf Figurenebene ändern oder die Figur später als Bilddatei speichern möchten (z fig.savefig('yourfilename.png'). B. mit ). Sie müssen das zurückgegebene Figurenobjekt sicherlich nicht verwenden, aber viele Leute verwenden es später, so dass es üblich ist, es zu sehen. Außerdem haben alle Achsenobjekte (die Objekte, die Plotmethoden haben) ohnehin ein übergeordnetes Figurenobjekt, also:

fig, ax = plt.subplots()

ist prägnanter als dies:

fig = plt.figure()
ax = fig.add_subplot(111)
Jonchar
quelle
7
Sehr gute Erklärung. Hier ist das Dokument darauf - matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.subplots
bretcj7
2
Warum verwenden wir im Subplot immer 111 als Parameter?
Priyansh
@Priyansh, weil es von Matlab-Syntax geerbt wird
pcko1
@Priyansh Nicht immer. Wenn Sie 4 Diagramme möchten, können Sie diese ax11, ax12, ax21, ax22verwenden fig.add_subplot(221)(oder 222, 223 bzw. 224).
Guimoute
49

Nur eine Ergänzung hier.

Die folgende Frage lautet: Was ist, wenn ich mehr Nebenhandlungen in der Abbildung möchte?

Wie im Dokument erwähnt, können wir fig = plt.subplots(nrows=2, ncols=2)eine Gruppe von Unterplots mit Raster (2,2) in einem Figurenobjekt festlegen.

Dann, wie wir wissen, fig, ax = plt.subplots()gibt das ein Tupel zurück, versuchen wir es fig, ax1, ax2, ax3, ax4 = plt.subplots(nrows=2, ncols=2)zuerst.

ValueError: not enough values to unpack (expected 4, got 2)

Es löst einen Fehler aus, aber keine Sorge, denn wir sehen jetzt, dass plt.subplots()tatsächlich ein Tupel mit zwei Elementen zurückgegeben wird. Das erste muss ein Figurenobjekt sein, und das andere sollte eine Gruppe von Nebenplotobjekten sein.

Versuchen wir es noch einmal:

fig, [[ax1, ax2], [ax3, ax4]] = plt.subplots(nrows=2, ncols=2)

und überprüfen Sie den Typ:

type(fig) #<class 'matplotlib.figure.Figure'>
type(ax1) #<class 'matplotlib.axes._subplots.AxesSubplot'>

Wenn Sie Parameter wie (nrows = 1, ncols = 4) verwenden, sollte das Format natürlich wie folgt lauten:

fig, [ax1, ax2, ax3, ax4] = plt.subplots(nrows=1, ncols=4)

Denken Sie also daran, die Konstruktion der Liste so zu halten, wie sie in der Abbildung festgelegt ist.

Hoffe das wäre hilfreich für dich.

Duskash
quelle
2
Vergessen Sie nicht, plt.tight_layout () hinzuzufügen, wenn Ihre
Nebenhandlungen
12
Was ist, wenn Sie viele Nebenhandlungen haben? Es ist einfacher, es so zu machen: fig, axes = plt.subplots(nrows=10, ncols=3)und axes = axes.flatten(). Jetzt können Sie zu jeder subplot durch seinen Index verweisen: axes[0], axes[1], ...
Guillaume
Was ist, wenn eine dieser Nebenhandlungen mehrere Spalten oder Zeilen umfassen soll? ist es mit dem Befehl subplots machbar?
Gota
1
@BallpointBen Ich bin mir nicht sicher, ob das funktioniert, wenn nrows=1, da dann axesflach mit einer Länge vonncols
Ben
1
@BallpointBen Ich habe gerade festgestellt, dass Sie dies beheben können, indem Sie Folgendes tun:fig, axes = plt.subplots(nrows=1, ncols=3, squeeze=False)
Ben
13

Als Ergänzung zu der Frage und den obigen Antworten gibt es auch einen wichtigen Unterschied zwischen plt.subplots()und plt.subplot(), beachten Sie das Fehlen 's'am Ende.

Man kann verwenden plt.subplots(), um alle ihre Unterzeichnungen auf einmal zu erstellen, und es werden die Figur und die Achsen (Plural der Achse) der Unterzeichnungen als Tupel zurückgegeben. Eine Figur kann als Leinwand verstanden werden, auf der Sie Ihre Skizze malen.

# create a subplot with 2 rows and 1 columns
fig, ax = plt.subplots(2,1)

Sie können jedoch verwenden, plt.subplot()wenn Sie die Unterzeichnungen separat hinzufügen möchten. Es wird nur die Achse eines Unterplots zurückgegeben.

fig = plt.figure() # create the canvas for plotting
ax1 = plt.subplot(2,1,1) 
# (2,1,1) indicates total number of rows, columns, and figure number respectively
ax2 = plt.subplot(2,1,2)

Wird plt.subplots()jedoch bevorzugt, da Sie damit einfacher Optionen haben, um Ihre gesamte Figur direkt anzupassen

# for example, sharing x-axis, y-axis for all subplots can be specified at once
fig, ax = plt.subplots(2,2, sharex=True, sharey=True)

Gemeinsame Achsen Während bei plt.subplot()muss für jede Achse einzeln angegeben werden, was umständlich werden kann.

Light_B
quelle
1
Ihre Codezeile ax3 = plt.subplot(2,1,3) funktioniert nicht, da sie 2 x 1 ist und nur 2 Diagramme enthält.
Cloud Cho
1
danke, behoben. Im letzten Codeblock war eine weitere Änderung erforderlich.
Light_B
2

Zusätzlich zu den obigen Antworten können Sie den Objekttyp überprüfen, mit type(plt.subplots())dem ein Tupel zurückgegeben wird. Andererseits werden type(plt.subplot())Rückgaben zurückgegeben, matplotlib.axes._subplots.AxesSubplotdie Sie nicht entpacken können.

John T.
quelle
4
Willkommen bei Stack Overflow! Dies ist wirklich ein Kommentar, keine Antwort. Mit etwas mehr Wiederholungen können Sie Kommentare posten . Vielen Dank!
Miroslav Glamuzina