mehrere plots mit matplotlib

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
heraklit
User
Beiträge: 31
Registriert: Donnerstag 8. März 2007, 16:50

Donnerstag 2. August 2007, 21:54

Hallo,
bei der Ausgabe einer Graphik mit matplotlib erscheint eine Toolbar, in der es u.a. möglich ist die Ausgabe zu speichern, die ursprpüngliche Ausgabe wieder herzustellen usw. Besonders interessiert mich hier der Button "Next view". In dem Programm, das ich demnächst erstellen werde, wird eine Liste von Punkten schrittweise verändert. Soll konkret heißen:
Ich gehe von einer Liste x mit z.B. 10 Punkten aus, welche 5 mal verändert wird. Ist es nun möglich jede der 5 Zustände zu plotten, wobei mit dem "next view" bzw. "previous view" button hin- und hergewechselt wird. Es soll also keine Ausgabe mittels subplot erfolgen. Wie lässt sich dies mit matplotlib realisieren?
Gruß
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Freitag 3. August 2007, 13:10

Hoi,

Ich nehme an, Du meinst die Ausgabe eines Plots mit pylab.show()?
Dann hängt die Antwort auf Deine Frage ein wenig von dem GUI-backend ab, welches Du nutzt. In meinem Fall (Backend = wx) gibt es für die Toolbar einen Stack: Wenn Du den Forward-Button drückst wird self._views.forward() der Toolbar aufgerufen. self._views ist der Stack. Du mußt also zusehen, das Deine Plots (in einem FigureCanvas) im Stack sind, damit Du auf diese Weise vor und zurück gehen kannst.
Allerdings ist das Problematisch, weil mein Stack davon ausgeht, daß es sich immer um denselben Canvas handelt: In den Stack, kommen nur die Eckpositionen der jeweiligen Darstellung.
Alternativ, kannst Du self._views.forward() auch an eine Methode binden, die einen Plot erst erzeugt, wenn Du auf den Button drückt und dann in einen eigenen Stack schreiben. (Ich mache manchmal was Ähnliches und lege die entsprechenden Plots in einer Liste ab und gehe dann vor und zurück in dem ich mir den Index merke - nicht so schön, wie ein sauber programmierter Stack, funktioniert aber.)


Mehr möchte ich nicht ins Detail gehen. Am Besten, Du schaust mal in den Beispielen (kann man von der matplotlib-Seite runterladen) nach. Dort gibt es für jedes Backend Beispielcode (Benennung der Beispielskripte: "embedding_in_xxx.py")

Hoffe das hilft Dir. Wenn nicht, schreibe nochmal hier, sage, welches Backend Du nutzt und gib ggf. Beispielcode von Dir zur Illustration.

Gruß,
Christian
heraklit
User
Beiträge: 31
Registriert: Donnerstag 8. März 2007, 16:50

Freitag 3. August 2007, 20:44

Hi,
eigentlich wollte ich kein nur matplotlib und es nicht in wx o.ä. einbetten. Ich hoffe du hast verstanden was ich meine. Man kann ja z.B. mehrere Grafiken mittels subplot() ausgeben, d.h. alle grafiken werden nebeneinander angezeigt. Ich möchte aber mittels des Buttons "Next view" zur nächsten Grafik springen. Ist das mit matplotlib möglich? Oder wozu gibt es sonst den Button "Next view"?
Gruß
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Sonntag 5. August 2007, 17:56

Hoi,

denk' mal über folgende Frage nach: Woher soll der Knopf "next view" denn wissen, was er anzeigen soll? Das mußt Du als Programmierer schon vorgeben. Wie das default-mäßig implementiert ist, habe ich kurz beschrieben. Du kannst es auf verschiedene Weise ändern.

Zur Klärung:
Ich möchte aber mittels des Buttons "Next view" zur nächsten Grafik springen. Ist das mit matplotlib möglich? Oder wozu gibt es sonst den Button "Next view"?
Wenn Du mit der Lupe oder mit dem pan/zoom-Tool neue Ansichten des Plots erzeugst, dann werden diese neuen Ansichten im Stack gespeichert und mit den Vor- und Zurückbuttons, kannst Du in diesen Ansichten vor und zurück springen.

Du benutzt fast sicher irgendein GUI-backend, wenn Du interaktiv Plots darstellst. Leider sagst Du nicht, was Du verwendest, aber wenn Du Dein backend anpassen willst, mußt Du die Implementierung ändern.

In der Shell -- oder in einem Skript -- bleiben die immer noch die Funtionen clf() (und close()) von pylab. Danach zeigst Du mit show() wieder nur das an, was Du zwischenzeitlich in den Puffer geschrieben hast.

Noch zwei Alternativen:
Schau Dir mal in Beispielen solche Beispiele mit mehreren Figures an, z.B. pie_demo.py. Nicht ganz, wonach Du fragst, aber vielleicht doch interessant.

IPython stellt aber ebenfalls Funktionalität zur Verfügung, die Du interessant finden könntest: Anzeigen von Daten mit pylab, Ändern der Daten, abermaliges Anzeigen.
Video und diverse andere Anleitungen findest Du auf der Homepage.

Zum Appetitmachen, führe mal folgenden Minicode in IPython aus:

Code: Alles auswählen

plot([1,2,3])
clf()
plot([12,0,23,1])
Ich möchte raten: Die letzte Alternative ist womöglich die Einfachste.

Gruß,
Christian
heraklit
User
Beiträge: 31
Registriert: Donnerstag 8. März 2007, 16:50

Dienstag 7. August 2007, 07:53

Hallo,
ich verwende wx-python. Werde mir mal deine Links genauer ansehen.
Vielen Dank
Antworten