webentwicklung-frage-antwort-db.com.de

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

Ich lerne, matplotlib zu verwenden, indem ich Beispiele studiere, und viele Beispiele scheinen eine Linie wie die folgende zu enthalten, bevor ich eine einzelne Zeichnung 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 subplots() verwendet auch f, ax = subplots, um ein einzelnes Diagramm zu erstellen, und verweist danach immer nur 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')
199
neelshiv

plt.subplots() ist eine Funktion, die ein Tupel zurückgibt, das eine Figur und Achsenobjekte enthält. Wenn Sie also fig, ax = plt.subplots() verwenden, entpacken Sie dieses Tupel in die Variablen fig und ax. fig ist nützlich, wenn Sie Attribute auf Abbildungsebene ändern oder die Abbildung später als Bilddatei speichern möchten (z. B. mit fig.savefig('yourfilename.png')). 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 (Objekte mit Plotmethoden) sowieso ein übergeordnetes Figurenobjekt.

fig, ax = plt.subplots()

ist prägnanter als dies:

fig = plt.figure()
ax = fig.add_subplot(111)
253
jonchar

Nur eine Ergänzung hier.

Die folgende Frage ist, was ist, wenn ich mehr Untergrundstücke in der Abbildung haben möchte?

Wie im Dokument erwähnt, können wir fig = plt.subplots(nrows=2, ncols=2) verwenden, um eine Gruppe von Teilplots mit Gitter (2,2) in einem Figurobjekt festzulegen.

Wie wir wissen, gibt fig, ax = plt.subplots() ein Tupel zurück. Versuchen wir zunächst fig, ax1, ax2, ax3, ax4 = plt.subplots(nrows=2, ncols=2).

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

Es wirft einen Fehler auf, aber keine Sorge, da wir jetzt sehen, dass plt.subplots() tatsächlich ein Tupel mit zwei Elementen zurückgibt. Das erste muss ein Figurenobjekt sein, und das andere sollte eine Gruppe von Untergrundobjekten sein.

Versuchen wir es also noch einmal:

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

und überprüfe 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, den Aufbau der Liste so zu gestalten, wie es in der Abbildung dargestellt ist.

Hoffe das wäre hilfreich für dich.

31
Duskash

Ergänzend zu der Frage und den obigen Antworten gibt es auch einen wichtigen Unterschied zwischen plt.subplots() und plt.subplot(). Beachten Sie den fehlenden 's' am Ende.

Man kann plt.subplots() verwenden, um alle Unterzeichnungen auf einmal zu erstellen, und es werden die Figur und die Achsen (mehrere Achsen) 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 plt.subplot() verwenden, 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)

plt.subplots() wird jedoch bevorzugt, da Sie auf diese Weise die Möglichkeit haben, 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)

Shared axes wohingegen mit plt.subplot() für jede Achse individuell festgelegt werden muss, was umständlich werden kann.

4
Light_B

Zusätzlich zu den obigen Antworten können Sie den Objekttyp mit type(plt.subplots()) überprüfen, der ein Tupel zurückgibt, während type(plt.subplot())matplotlib.axes._subplots.AxesSubplot zurückgibt, das Sie nicht entpacken können.

1
John T