Nichtblockende Alternative zu maplotlib show()

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
booth
User
Beiträge: 44
Registriert: Mittwoch 31. Oktober 2007, 21:30
Wohnort: Durham, U.K.

Hallo,

ich such seit geraumer Zeit nach einer Moeglichkeit plots nacheinander automatisch darzustellen OHNE das ich jedesmal das Fenster von Hand schliessen muss.

Also z.B.: Rechnung 1 wird geplottet, dann wird Rechnung 2 ausgefuehrt. Bis Rechnung 2 fertig ist wuerde ich gerne das Ergebnis von R. 1 angezeigt bekommen und dann die Figure loeschen und das Ergebnis von Rechnung 2 in dem Fenster anzeigen waehrend Rechnung 3 gemacht wird usw. usf.

Das Bloede ist nur, dass das nicht geht ;)
Ich kann zwar draw() nach dem jeden plot(x,y) schreiben, aber das heisst nicht, dass irgendwas angezeigt wird. Erst mit einem show() werden alle Plots auf einmal angezeigt und jede weitere Rechnung eingefroren bis ich die Fenster von Hand geschlossen habe.

Gibt es da irgendeine einfache Loesung? Was genau ion() bringen soll habe ich nicht rausgefunden, nur das es nicht die Loesung ist :)

vG, U.
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Versuch es mal mit

Code: Alles auswählen

matplotlib.interactive(True)
dann dürfte nach einem show() die Berechnungen nicht eingefroren werden.
booth
User
Beiträge: 44
Registriert: Mittwoch 31. Oktober 2007, 21:30
Wohnort: Durham, U.K.

ice2k3 hat geschrieben:Versuch es mal mit

Code: Alles auswählen

matplotlib.interactive(True)
dann dürfte nach einem show() die Berechnungen nicht eingefroren werden.
Das ist schon die halbe Miete, vielen Dank. Allerdings hat es noch einen kleinen Haken. Zum Beispiel folgendes Programm:

Code: Alles auswählen

from matplotlib.pyplot import close, figure, plot, draw, show, ion
from matplotlib import interactive
from numpy import array

interactive(True) 

b = array([[1,2,3], [3,2,1]])

for n in range(0, len(b)):
    figure(n+1)
    plot(b[n,:])
    show()

raw_input('end') 
Zeigt die erste Figure an und oeffnet fuer die zweite ein Fenster, zeigt die Daten aber nicht an.

Was ist der Unterschied zwischen matplotlib.interactive(True) und ion()?

vG, U.
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Vielleicht schaust du dir mal an, wie ``ipython -pylab`` das macht, denn darin funktionieren die mpl-Befehle auch interaktiv.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Der interaktive Modus funktioniert vermutlich nur aus einer GUI Anwendung heraus. Folgendes Beispiel funktioniert:

Code: Alles auswählen

from matplotlib.pyplot import close, figure, plot, draw, show, ion 
from matplotlib import interactive 
from numpy import array
import gtk
import gobject

def show_plots():
    b = array([[1,2,3], [3,2,1]]) 

    for row in b:
        figure() 
        plot(row)
        show()

interactive(True)
gobject.timeout_add(200, show_plots)
gtk.main()
Bei einem anderen Backend muss das vermutlich etwas anders aussehen. ion() ist vermutlich dasselbe wie interactive(True).

P.S. Iterier in Zukunft auch so über eine Liste, und benutze nicht die range Funktion, es gibt eigentlich fast kein Fall in Python, in der man diese Funktion wirklich benötigt.
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

ice2k3 hat geschrieben: P.S. Iterier in Zukunft auch so über eine Liste, und benutze nicht die range Funktion, es gibt eigentlich fast kein Fall in Python, in der man diese Funktion wirklich benötigt.
Das stimmt so auch wieder nicht. Man braucht sie nur nicht, um dann die Zahlen als Indizes für eine Sequenz zu benutzen.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
booth
User
Beiträge: 44
Registriert: Mittwoch 31. Oktober 2007, 21:30
Wohnort: Durham, U.K.

birkenfeld hat geschrieben:Vielleicht schaust du dir mal an, wie ``ipython -pylab`` das macht, denn darin funktionieren die mpl-Befehle auch interaktiv.
Wuerde ich machen aber seit einer Neuinstallation der Enthought-Distribution bekomme ich von Python immer einen Bus-Error wenn ich pylab importiere. Wenn ich matplotlib importiere ist alles super. Keine Ahnung wo der Unterschied ist. Ich dachte immer das sind die gleichen Module.
booth
User
Beiträge: 44
Registriert: Mittwoch 31. Oktober 2007, 21:30
Wohnort: Durham, U.K.

ice2k3 hat geschrieben:Der interaktive Modus funktioniert vermutlich nur aus einer GUI Anwendung heraus. Folgendes Beispiel funktioniert:

Code: Alles auswählen

from matplotlib.pyplot import close, figure, plot, draw, show, ion 
from matplotlib import interactive 
from numpy import array
import gtk
import gobject

def show_plots():
    b = array([[1,2,3], [3,2,1]]) 

    for row in b:
        figure() 
        plot(row)
        show()

interactive(True)
gobject.timeout_add(200, show_plots)
gtk.main()
Bei einem anderen Backend muss das vermutlich etwas anders aussehen. ion() ist vermutlich dasselbe wie interactive(True).

P.S. Iterier in Zukunft auch so über eine Liste, und benutze nicht die range Funktion, es gibt eigentlich fast kein Fall in Python, in der man diese Funktion wirklich benötigt.
Du benutzt hier (wenn ich das richtig kapiere) explizit GTK als Backend. Macht das die ganze Sache nicht sehr unportabel. Ich habe keine Ahnung was die Windowskiste auf der das nachher laufen soll als Backend benutzt. Hier sitze ich normalerweise an einem Mac.

Das mit der range()-Funktion habe ich gemacht um die Zaehlervariable benutzen zu koennen. Die gibt es in der Iterations-Variante nicht. Kann man natuerlich zusaetzlich erzeugen. Keine Ahnung was von beidem besser/schneller ist.
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

booth hat geschrieben: Das mit der range()-Funktion habe ich gemacht um die Zaehlervariable benutzen zu koennen. Die gibt es in der Iterations-Variante nicht. Kann man natuerlich zusaetzlich erzeugen. Keine Ahnung was von beidem besser/schneller ist.
Wenn du den Index zu einer Liste benötigst und iterieren willst, gibt es noch enumerate:

Code: Alles auswählen

>>> iter_list = ["a", "b", "c"]
>>> for i, item in enumerate(iter_list):
	print i, item

	
0 a
1 b
2 c
booth
User
Beiträge: 44
Registriert: Mittwoch 31. Oktober 2007, 21:30
Wohnort: Durham, U.K.

ice2k3 hat geschrieben: Wenn du den Index zu einer Liste benötigst und iterieren willst, gibt es noch enumerate:
Das kannte ich noch nicht. Sehr praktisch. Vielen Dank.
Bin gerade dabei GTK, GLib etc. pp. zu installieren um das Programm mal zu testen.

vG, U.
Antworten