Was ist der Unterschied zwischen dem Zeichnen von Plots mit Plot, Achsen oder Figuren in matplotlib?

92

Ich bin etwas verwirrt darüber, was im Backend vor sich geht, wenn ich Plots in matplotlib zeichne. Tbh, ich bin nicht klar mit der Hierarchie von Plot, Achsen und Figur. Ich habe die Dokumentation gelesen und es war hilfreich, aber ich bin immer noch verwirrt ...

Der folgende Code zeichnet das gleiche Diagramm auf drei verschiedene Arten:

#creating the arrays for testing
x = np.arange(1, 100)
y = np.sqrt(x)
#1st way
plt.plot(x, y)
#2nd way
ax = plt.subplot()
ax.plot(x, y)
#3rd way
figure = plt.figure()
new_plot = figure.add_subplot(111)
new_plot.plot(x, y)

Jetzt ist meine Frage -

  1. Was ist der Unterschied zwischen allen drei, ich meine, was geht unter der Haube, wenn eine der drei Methoden aufgerufen wird?

  2. Welche Methode sollte wann angewendet werden und welche Vor- und Nachteile hat die Verwendung dieser Methoden?

Hashcode55
quelle
8
Ich habe das bereits gelesen, aber ich fand die Antwort überhaupt nicht zufriedenstellend. Es erklärt die Hierarchie, wirft aber auch die Verwirrung auf, warum es keinen konventionellen Weg gibt, warum das Figurenobjekt überhaupt belichtet wird.
Hashcode55
Ich bin nicht sicher, ob Sie genau auf diese Dokumentation matplotlib.org/users/artists.html verwiesen haben . Dies beantwortet Ihre Frage, warum die Figur überhaupt freigelegt ist. Persönlich ist dies die beste Erklärung für Matplotlib, die ich gefunden habe. Mit dem Figurenobjekt können Sie Ihre eigenen Künstler direkt ohne Achsen hinzufügen, obwohl dies nur selten verwendet wird, es sei denn, Sie möchten den "Patch" der Figur selbst usw. optimieren. Beachten Sie, dass die Figur der übergeordnete Container ist und Achsen und Künstler hostet.
Sandeep

Antworten:

50

Methode 1

plt.plot(x, y)

Auf diese Weise können Sie nur eine Figur mit (x, y) -Koordinaten zeichnen. Wenn Sie nur eine Grafik erhalten möchten, können Sie diese Methode verwenden.

Methode 2

ax = plt.subplot()
ax.plot(x, y)

Auf diese Weise können Sie eine oder mehrere Figuren im selben Fenster zeichnen. Während Sie es schreiben, zeichnen Sie nur eine Figur, aber Sie können so etwas machen:

fig1, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2)

Sie zeichnen 4 Figuren mit den Namen ax1, ax2, ax3 und ax4, die sich jedoch im selben Fenster befinden. Dieses Fenster wird mit meinem Beispiel nur in 4 Teile unterteilt.

Methode 3

fig = plt.figure()
new_plot = fig.add_subplot(111)
new_plot.plot(x, y)

Ich habe es nicht benutzt, aber Sie können Dokumentation finden.

Beispiel:

import numpy as np
import matplotlib.pyplot as plt

# Method 1 #

x = np.random.rand(10)
y = np.random.rand(10)

figure1 = plt.plot(x,y)

# Method 2 #

x1 = np.random.rand(10)
x2 = np.random.rand(10)
x3 = np.random.rand(10)
x4 = np.random.rand(10)
y1 = np.random.rand(10)
y2 = np.random.rand(10)
y3 = np.random.rand(10)
y4 = np.random.rand(10)

figure2, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2)
ax1.plot(x1,y1)
ax2.plot(x2,y2)
ax3.plot(x3,y3)
ax4.plot(x4,y4)

plt.show()

Geben Sie hier die Bildbeschreibung ein Geben Sie hier die Bildbeschreibung ein

Anderes Beispiel:

Geben Sie hier die Bildbeschreibung ein

Essex
quelle
@ Hashcode55 Jede Figur ist unabhängig. Ich werde Ihnen ein Beispiel zeigen
Essex
1
@ hashcode55 Ich werde mit einem Beispiel bearbeiten (nur die Abbildung aus meinen Forschungen in der Astrophysik, das Skript ist zu lang (1300 Zeilen));) Jede Abbildung ist unabhängig;)
Essex
3
Ich weiß, dass dies nicht pingelig ist, aber ich mache es, weil die matplotlibSprache für mich verwirrend war, und diese Frage taucht auf, wenn nach "Achsen vs. Figur in Matplotlib" gesucht wird. Für andere Noobs half diese Frage, das zu beantworten. Ich denke, der Wortlaut hier könnte klarer sein, subplots()der AxesObjekte auf einem einzigen zurückgibt figure.
Hendy
29

Die Namen von Objekten

Matplotlib ist stark objektorientiert und seine Hauptobjekte sind die Figur und die Achsen (ich finde den Namen axesetwas irreführend, aber wahrscheinlich bin es nur ich).

Sie können sich die Figur als Leinwand vorstellen , von der Sie normalerweise die Abmessungen und möglicherweise z. B. die Hintergrundfarbe usw. usw. angeben. Sie verwenden die Leinwand, die Figur , im Wesentlichen auf zwei Arten, indem Sie andere Objekte darauf platzieren (meistens Achsen , aber auch Textbeschriftungen usw.) und Speichern des Inhalts mit savefig.

Sie können von einem denken Achsen als eine Art Schweizer Taschenmesser, ein handliches Objekt , das bietet ein Werkzeug (zB .plot, .scatter, .histetc.) für alles, meistens. Sie können eine, zwei, ... viele Achsen innerhalb einer Figur mit einer von vielen verschiedenen Methoden platzieren.

Die pltSchnittstelle

Die plt- prozedurale Schnittstelle wurde ursprünglich entwickelt, um die MATLAB ™ -Schnittstelle nachzuahmen, unterscheidet sich jedoch nicht wirklich von der objektorientierten Schnittstelle, selbst wenn Sie nicht direkt auf die Hauptobjekte (dh eine Figur und eine Achse ) verweisen, die diese Objekte sind automatisch instanziiert und jede plt- Methode wird im Wesentlichen in einen Aufruf einer der Methoden der zugrunde liegenden fundamentalen Objekte übersetzt: z. B. a plt.plot()ist a hidden_axes.plotund a plt.savefigist a hidden_figure.savefig.

In jedem Moment können Sie diese versteckten Objekte mit plt.gcfund handhaben. plt.gcaDies ist manchmal erforderlich, wenn eine der Objektmethoden nicht auf eine Methode im plt- Namespace portiert wurde .

Ich möchte hinzufügen, dass der plt- Namespace auch eine Reihe von praktischen Methoden enthält, um Figuren und Achsen auf unterschiedliche Weise zu instanziieren .

Ihre Beispiele

1. Weg

plt.plot(x, y)

Hier verwenden Sie nur die plt- Schnittstelle. Sie können in jeder Abbildung nur eine einzige Achse verwenden. Dies ist jedoch das, was Sie möchten, wenn Sie Ihre Daten untersuchen, ein schnelles Rezept, mit dem die Arbeit erledigt wird ...

2. Weg

ax = plt.subplot()
ax.plot(x, y)

Hier verwenden Sie eine bequeme Methode in dem PLT - Namespace einen Namen (und einen Griff) , um Ihr geben Achsen Objekt, aber btw gibt es auch eine versteckte Figur . Sie können später verwenden die Achsen zum Grundstück Objekt, um ein Histogramm usw. zu machen, alles Dinge , die Sie mit dem tun PLT - Schnittstelle, aber Sie können auch alle seine Attribute zugreifen und sie mit größerer Freiheit ändern.

3. Weg

figure = plt.figure()
new_plot = figure.add_subplot(111)
new_plot.plot(x, y)

Hier beginnen Sie a zu instanziieren Figur mithilfe einer praktischen Methode im plt- Namespace und verwenden später nur die objektorientierte Schnittstelle.

Es ist möglich, den plt zu umgehen Convenience-Methode ( matplotlib.figure.Figure) aber Sie müssen die Zahl dann um eine bessere interaktive Erfahrung zu (schließlich handelt es sich um eine Convenience- Methode).

Persönliche Empfehlungen

Ich schlage vor plt.plot, plt.scatterim Rahmen einer interaktiven Sitzung möglicherweise IPython mit seiner zu verwenden%matplotlib magischen Befehl zu verwenden und auch im Kontext eines explorativen Jupyter-Notizbuchs.

Auf der anderen Seite der objektorientierte Ansatz plus einige plt praktische Methoden der richtige Weg

  • Wenn Sie ein permanentes Problem haben, das Sie ein für alle Mal mit einer maßgeschneiderten Anordnung fein abgestimmter Nebenhandlungen lösen müssen,
  • Wenn Sie Matplotlib in die Benutzeroberfläche eines von Ihnen geschriebenen Programms einbetten möchten.

Es gibt eine große Grauzone zwischen diesen Extremen und wenn Sie mich fragen, was ich tun soll, würde ich einfach sagen "Es kommt darauf an" ...

gboffi
quelle