2016-05-13 12 views
1

Ich muss die pyplot Objekte behandeln, wie Figuren und Achsen. Hier ist ein vereinfachtes Beispiel dessen, was ich will:Objektorientierte pyplot

In [1]: import matplotlib.pyplot as mp 

In [2]: fig = mp.figure()    # create a figure 

In [3]: mp.show()      # and immediately show it. And close. 

In [4]: ax = fig.add_subplot(111)  # Then I create a plot on that figure 

In [5]: ax.plot([1, 2, 3]) 
Out[5]: [<matplotlib.lines.Line2D at 0x104e29a50>] 

In [6]: mp.get_fignums()    # But I already released the figure, so it doesn't appear in the list of available figures 
Out[6]: [] 

In [7]: fig.axes[0].lines[0].get_data() # The data is there, on the plot 
Out[7]: (array([ 0., 1., 2.]), array([1, 2, 3])) 

In [8]: mp.show()      # But mp.show() shows nothing. 

Die fig.show() funktioniert auch nicht. Wie zeige ich eine Figur nach der Veröffentlichung?

UPD: Es gab eine ähnliche Frage: Matplotlib: re-open a closed figure?, aber ohne Antwort.

+0

Warum nicht einfach mit einem Arbeits 'matplotlib' Beispiel beginnen? – linusg

+0

Ich würde mich freuen, ein Arbeitsbeispiel zu haben, wo gezeigt wird, wie man die freigesetzten Figuren abholt. – user3631854

Antwort

0

Try this:

import matplotlib.pyplot as mp 

fig = mp.figure() 

plt.show() # empty figure appears, close it 

fig = plt.gcf() # get current figure, this is the key piece. 

ax = fig.add_subplot(111) # added axes object 

ax.plot([1,2,3]) 

plt.show() 

Als ich das tat, konnte ich den Plot bekommen zu zeigen, mit einer diagonalen Linie aufgetragen.

+0

Leider ist es falsch. Wenn Sie plt.gcf() ausführen, erstellen Sie eine neue Figur und weisen diese neue Figur der alten Variablen zu. So verlieren Sie die alte Figur. Sie können überprüfen, ob die Adressen der fig vor und nach dem Aufruf von plt.gcf() unterschiedlich sind. – user3631854

-1

Ich habe es gefunden! Lassen Sie uns einen mp.Figure erstellen()

import matplotlib.pyplot as mp 
fig = mp.Figure() 

Nun ist es nicht pyplot verbunden, so können wir es nicht zeigen. Es entspricht dem, was passiert, wenn Sie eine Figur schließen. Die Tatsache, dass man keine Figur zeigen kann, die nicht mit Pyplot verbunden ist, ist gut dokumentiert. Versuchen Sie einfach,

In []: fig.show? 
Docstring: 
If using a GUI backend with pyplot, display the figure window. 
For non-GUI backends, this does nothing. 

(ich den Text der Hilfemeldung reduziert.) Aber es ist möglich, die pyplot Trick. Lassen Sie uns eine Figur erstellen:

temp_fig = mp.figure() 
die Figur Manager von temp_fig Steal

und weisen Sie auf unsere fig:

m = mp.get_current_fig_manager() 
fig.canvas.manager = m 

Jetzt können wir es zeigen:

mp.show() # Shows the fig figure. 

Natürlich ist es eine gute Praxis, um die Temp_fig zu löschen:

del temp_fig 
+0

Das macht es viel komplizierter als es sein muss. Wenn Sie ein "Figur" -Objekt erstellen möchten, müssen Sie auch ein "Canvas" -Objekt dafür erstellen.Für die GUI-Backends sind die "Canvas" -Objekte Unterklassen der "Widgets" für das gegebene Rahmenwerk und müssen in eine GUI eingebettet sein, die Figurenmanager kümmern sich darum für 'pyplot'. – tacaswell

+0

Ich stimme das aus diesen Gründen ab. Bitte nehmen Sie es nicht persönlich, ich möchte nur mit einer Methode stärker als ein Kommentar angeben, dass diese Antwort nicht die empfohlene Art ist, mpl interaktiv zu verwenden. – tacaswell

0

Which is the recommended way to plot: matplotlib or pylab? Frage ist für diese Frage relevant.

Die Schnittstelle pyplot ist ein Komfortmodul, das a) offene Zahlen und b) die aktuelle Figur und die aktuellen Achsen erfasst. Darunter befindet sich die OO-Schnittstelle.

Um eine offene Figur und zu haben, können Sie neue Befehle in den repl eingeben. Sie müssen im 'interaktiven' Modus sein, der die python repl-Schleife mit der GUI-Ereignisschleife integriert.

Aus Ihrer Frage sieht es aus wie Sie IPython so verwenden Sie die %matplotlib Magie verwenden:

16:31 $ ipython 
Python 3.5.1 |Continuum Analytics, Inc.| (default, Dec 7 2015, 11:16:01) 
Type "copyright", "credits" or "license" for more information. 

IPython 4.2.0 -- An enhanced Interactive Python. 
?   -> Introduction and overview of IPython's features. 
%quickref -> Quick reference. 
help  -> Python's own help system. 
object? -> Details about 'object', use 'object??' for extra details. 

In [1]: %matplotlib 
Using matplotlib backend: Qt4Agg 

In [2]: import matplotlib.pyplot as plt 

In [3]: fig, ax = plt.subplots() # prompt returns immediatly leaving open figure 

In [4]: ln, = ax.plot(range(15), label='test') # draws line and updates figure 

In [5]: ln.set_linewidth(5) # changes lw and updates screen 

In [6]: