Wie kann ich Matplotlib anweisen, einen zweiten (neuen) Plot und später einen Plot auf dem alten zu erstellen?

147

Ich möchte Daten plotten, dann eine neue Figur und Plotdaten2 erstellen und schließlich zu den ursprünglichen Plot- und Plotdaten3 zurückkehren.

import numpy as np
import matplotlib as plt

x = arange(5)
y = np.exp(5)
plt.figure()
plt.plot(x, y)

z = np.sin(x)
plt.figure()
plt.plot(x, z)

w = np.cos(x)
plt.figure("""first figure""") # Here's the part I need
plt.plot(x, w)

Zu Ihrer Information Wie kann ich matplotlib mitteilen, dass ich mit einer Handlung fertig bin? macht etwas ähnliches, aber nicht ganz! Ich kann nicht auf diese ursprüngliche Handlung zugreifen.

Peter D.
quelle

Antworten:

152

Wenn Sie solche Dinge regelmäßig tun, kann es sich lohnen, die objektorientierte Schnittstelle zu matplotlib zu untersuchen. In deinem Fall:

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(5)
y = np.exp(x)
fig1, ax1 = plt.subplots()
ax1.plot(x, y)
ax1.set_title("Axis 1 title")
ax1.set_xlabel("X-label for axis 1")

z = np.sin(x)
fig2, (ax2, ax3) = plt.subplots(nrows=2, ncols=1) # two axes on figure
ax2.plot(x, z)
ax3.plot(x, -z)

w = np.cos(x)
ax1.plot(x, w) # can continue plotting on the first axis

Es ist etwas ausführlicher, aber es ist viel klarer und einfacher zu verfolgen, insbesondere bei mehreren Figuren mit jeweils mehreren Nebenhandlungen.

simonb
quelle
2
Ich bevorzuge den objektorientierten Ansatz, da es einfacher ist, den Überblick zu behalten, wenn ich viele Zahlen erwarte, indem ich Namen anstelle von Zahlen verwende. Vielen Dank!
Peter D
1
Aber wie kann man mit diesem Ansatz die Beschriftungs- und Achsengrenzen ändern? Wenn ich es benutze ax1.ylabel, heißt es, dass es nicht gefunden wird. Gleiches gilt für fig1.ylabel...
George Datseris
3
@ GeorgeDatseris Die Syntax ist etwas anders. Es ist ax1.set_xlabel("your x label"), ax1.set_ylabel("your y label")und ax1.set_title("your title").
Simonb
1
Warum hast du 111 benutzt?
Yash Sodha
2
@yashSodha - das ist eine Matlab-artige Angabe der Anzahl der Unterzeichnungen (Zeilen, Spalten, Index). Aber es ist jetzt viel einfacher zu bedienen plt.subplots(nrows, ncols). Habe das Beispiel aktualisiert.
Simonb
120

Wenn Sie anrufen figure, nummerieren Sie einfach das Grundstück.

x = arange(5)
y = np.exp(5)
plt.figure(0)
plt.plot(x, y)

z = np.sin(x)
plt.figure(1)
plt.plot(x, z)

w = np.cos(x)
plt.figure(0) # Here's the part I need
plt.plot(x, w)

Bearbeiten: Beachten Sie, dass Sie die Diagramme beliebig nummerieren können (hier ab 0). Wenn Sie jedoch beim Erstellen eines neuen Diagramms überhaupt keine Nummer angeben, beginnt die automatische Nummerierung bei 1("Matlab Style" entsprechend zu den Dokumenten).

agf
quelle
3
Dies scheint im interaktiven Modus von matplotlib zu funktionieren, während dies bei der Methode figure () ... add_subplot () nicht der Fall ist. Vielen Dank!
Chbrown
@SebMa Bitte ändern Sie den Code nicht, ohne ihn zu verstehen. Bei dieser Antwort ging es speziell darum, eine Nummer zu übergeben figure, die Sie entfernt haben. Die anderen Dinge, die Sie geändert haben, wurden aus dem ursprünglichen Beitrag kopiert und keine Fehler in meiner Antwort.
Agf
@agf Hallo, ich habe das 1Innere entfernt, plt.figure(1)weil ich dachte, die Nummer wurde automatisch erhöht und ist daher nicht notwendig. Es tut uns leid.
SebMa
18

Die Nummerierung beginnt jedoch bei 1:

x = arange(5)
y = np.exp(5)
plt.figure(1)
plt.plot(x, y)

z = np.sin(x)
plt.figure(2)
plt.plot(x, z)

w = np.cos(x)
plt.figure(1) # Here's the part I need, but numbering starts at 1!
plt.plot(x, w)

Wenn Sie mehrere Achsen in einer Figur haben, z. B. Unterzeichnungen, verwenden Sie den axes(h)Befehl, bei dem hsich das Handle des gewünschten Achsenobjekts befindet, um sich auf diese Achsen zu konzentrieren.

(Ich habe noch keine Kommentarberechtigungen, entschuldige die neue Antwort!)

Ross B.
quelle
10
0funktioniert, die automatische Nummerierung beginnt erst bei 1, wenn Sie ihr überhaupt keine Nummer geben.
2.
0

Eine Möglichkeit, die ich nach einigen Schwierigkeiten gefunden habe, besteht darin, eine Funktion zu erstellen, die die Matrix data_plot, den Dateinamen und die Reihenfolge als Parameter abruft, um Boxplots aus den angegebenen Daten in der geordneten Abbildung (unterschiedliche Ordnungen = unterschiedliche Abbildungen) zu erstellen und unter dem angegebenen Dateinamen zu speichern.

def plotFigure(data_plot,file_name,order):
    fig = plt.figure(order, figsize=(9, 6))
    ax = fig.add_subplot(111)
    bp = ax.boxplot(data_plot)
    fig.savefig(file_name, bbox_inches='tight')
    plt.close()
Emir
quelle