Seite 1 von 1
Nichtblockende Alternative zu maplotlib show()
Verfasst: Dienstag 23. Juni 2009, 09:31
von booth
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.
Verfasst: Dienstag 23. Juni 2009, 11:35
von ms4py
Versuch es mal mit
dann dürfte nach einem show() die Berechnungen nicht eingefroren werden.
Verfasst: Dienstag 23. Juni 2009, 11:53
von booth
ice2k3 hat geschrieben:Versuch es mal mit
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.
Verfasst: Dienstag 23. Juni 2009, 12:12
von birkenfeld
Vielleicht schaust du dir mal an, wie ``ipython -pylab`` das macht, denn darin funktionieren die mpl-Befehle auch interaktiv.
Verfasst: Dienstag 23. Juni 2009, 12:28
von ms4py
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.
Verfasst: Dienstag 23. Juni 2009, 12:31
von birkenfeld
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.
Verfasst: Dienstag 23. Juni 2009, 12:55
von booth
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.
Verfasst: Dienstag 23. Juni 2009, 12:58
von booth
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.
Verfasst: Mittwoch 24. Juni 2009, 08:04
von ms4py
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
Verfasst: Mittwoch 24. Juni 2009, 08:10
von booth
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.