Wie bekomme ich mehrere Nebenhandlungen in matplotlib?

155

Ich bin etwas verwirrt darüber, wie dieser Code funktioniert:

fig, axes = plt.subplots(nrows=2, ncols=2)
plt.show()

Wie funktionieren die Feigenachsen in diesem Fall? Was tut es?

Auch warum sollte dies nicht funktionieren, um dasselbe zu tun:

fig = plt.figure()
axes = fig.subplots(nrows=2, ncols=2)
Bugsyb
quelle
1
Ab matplotlib 2.1 die zweite Code funktioniert .
Fermi Paradox

Antworten:

207

Es gibt verschiedene Möglichkeiten, dies zu tun. Die subplotsMethode erstellt die Figur zusammen mit den Unterplots, die dann im axArray gespeichert werden . Beispielsweise:

import matplotlib.pyplot as plt

x = range(10)
y = range(10)

fig, ax = plt.subplots(nrows=2, ncols=2)

for row in ax:
    for col in row:
        col.plot(x, y)

plt.show()

Geben Sie hier die Bildbeschreibung ein

So etwas funktioniert jedoch auch, es ist jedoch nicht so "sauber", da Sie eine Figur mit Nebenhandlungen erstellen und diese dann hinzufügen:

fig = plt.figure()

plt.subplot(2, 2, 1)
plt.plot(x, y)

plt.subplot(2, 2, 2)
plt.plot(x, y)

plt.subplot(2, 2, 3)
plt.plot(x, y)

plt.subplot(2, 2, 4)
plt.plot(x, y)

plt.show()

Geben Sie hier die Bildbeschreibung ein

Wichtigkeit von BeErnest
quelle
4
Anstatt plot(x, y)dass mein Plot von einer benutzerdefinierten Funktion stammt, die mit networkx ein Diagramm erstellt. Wie benutzt man es?
Sigur
Ist es möglich, mehrere Unterzeichnungen ohne for-Schleife zu erstellen? ZB eine vektorisierte Lösung zum Zeichnen mehrerer Datenspalten auf separaten Plots? Dies ist mit ggplot in R sehr einfach, scheint aber mit Python unmöglich zu sein.
user2739472
3
Sie können die beiden for-Schleifen um eine reduzieren axn = ax.flatten()und dann for axes in axn: axes.plot(x,y)
wander95
@ wander95 DANKE diese Antwort funktioniert nicht für col = 1 oder row = 1 ohne dich
Gulzar
48
import matplotlib.pyplot as plt

fig, ax = plt.subplots(2, 2)

ax[0, 0].plot(range(10), 'r') #row=0, col=0
ax[1, 0].plot(range(10), 'b') #row=1, col=0
ax[0, 1].plot(range(10), 'g') #row=0, col=1
ax[1, 1].plot(range(10), 'k') #row=1, col=1
plt.show()

Geben Sie hier die Bildbeschreibung ein

Khalil Al Hooti
quelle
1
Ich verstehe was axist, aber nicht was ist fig. Was sind Sie?
Leevo
3
ax ist eigentlich ein numpy array. fig ist eine matplotlib.figure.FigureKlasse, durch die Sie die geplottete Figur stark manipulieren können. Sie können beispielsweise einem bestimmten Unterplot eine Farbleiste hinzufügen und die Hintergrundfarbe hinter allen Unterplots ändern. Sie können das Layout dieser Untergrundstücke ändern oder ihnen eine neue kleine Axt hinzufügen. Am besten möchten Sie einen einzigen Haupttitel für alle Nebenhandlungen, die über die fig.suptitle(title)Methode erhalten werden können. Sobald Sie mit dem Plot zufrieden sind, können Sie ihn mithilfe der fig.savefigMethode speichern . @ Leevo
Khalil Al Hooti
21
  • Sie können auch die Achsen im Unterplotaufruf entpacken

  • Legen Sie fest, ob Sie die x- und y-Achse zwischen den Unterplots teilen möchten

So was:

import matplotlib.pyplot as plt
fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(nrows=2, ncols=2, sharex=True, sharey=True)
ax1.plot(range(10), 'r')
ax2.plot(range(10), 'b')
ax3.plot(range(10), 'g')
ax4.plot(range(10), 'k')
plt.show()

Geben Sie hier die Bildbeschreibung ein

Colin Anthony
quelle
14

Sie könnten daran interessiert sein, dass ab matplotlib Version 2.1 auch der zweite Code aus der Frage gut funktioniert.

Aus dem Änderungsprotokoll :

Die Figurenklasse verfügt jetzt über eine Subplots-Methode Die Figure-Klasse verfügt jetzt über eine Subplots () -Methode, die sich wie pyplot.subplots () verhält, jedoch für eine vorhandene Figur.

Beispiel:

import matplotlib.pyplot as plt

fig = plt.figure()
axes = fig.subplots(nrows=2, ncols=2)

plt.show()
Wichtigkeit von BeErnest
quelle
Ich erhalte: AttributeError Traceback (letzter Aufruf zuletzt) ​​<ipython-input-168-ed25aa5255fa> in <module> () 2 3 fig = plt.figure () ----> 4 Achsen = fig.subplots (nrows = 2 , ncols = 2) AttributeError: 'Figure'-Objekt hat kein Attribut' Subplots '
Ludo Schmidt
1
@ LudoSchmidt Die Antwort lautet "ab Matplotlib Version 2.1 ..."
ImportanceOfBeingErnest
11

Lesen Sie die Dokumentation: matplotlib.pyplot.subplots

pyplot.subplots()Gibt ein Tupel zurück, fig, axdas unter Verwendung der Notation in zwei Variablen entpackt wird

fig, axes = plt.subplots(nrows=2, ncols=2)

der Code

fig = plt.figure()
axes = fig.subplots(nrows=2, ncols=2)

funktioniert nicht, da subplots()eine Funktion pyplotkein Mitglied des Objekts ist Figure.

Diziet Asahi
quelle