Graph als Rückgabewert

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
möppi
User
Beiträge: 39
Registriert: Samstag 29. März 2014, 09:18

Hi,

Ich möchte eine Funktion definieren, die einen Graph als Rückgabewert liefert. Bisher habe ich:

Code: Alles auswählen

import numpy as np
import matplotlib.pyplot as plt

def plot3d(x_array,y_array,z_array,x_label,y_label,z_label):
    fig=plt.figure()
    fig=plt.pcolormesh(x_array,y_array,z_array.T) 
    cb=plt.colorbar()
    fig=plt.xlabel(x_label)
    fig=plt.ylabel(y_label)
    cb.set_label(z_label)
    return fig

#x,y,z sind vorher definierte Arrays
figure=plot3d(y,x,z)
1. Ist es überhaupt von der Schreibweise so weit in Ordnung?
2. Warum wird der Graph aufgerufen, obwohl ich eigentlich nur einer variablen den Graph zuweise? Wie schaffte ich es, dass der Output von dem Canvas unterdrückt wird?
3. Was mache ich, wenn ich die den Graph aus der Variable "figure" aufrufen will?
Ich an sowas gedacht:

Code: Alles auswählen

plt.show(figure)
Gruß
BlackJack

@möppi: Was bedeutet denn ”aufrufen” bei Dir? Meinst Du vielleicht anzeigen stattdessen?

Was denkst Du denn was an den Namen `fig` gebunden wird und was damit zurückgegeben wird. Ich denke Da hast Du eine falsche Vorstellung wie die Zuweisung mit ``=`` funktioniert.
möppi
User
Beiträge: 39
Registriert: Samstag 29. März 2014, 09:18

BlackJack hat geschrieben:@möppi: Was bedeutet denn ”aufrufen” bei Dir? Meinst Du vielleicht anzeigen stattdessen?

Was denkst Du denn was an den Namen `fig` gebunden wird und was damit zurückgegeben wird. Ich denke Da hast Du eine falsche Vorstellung wie die Zuweisung mit ``=`` funktioniert.
Ich möchte so zu sagen, den Graph definieren aber ihn an anderer Stelle anzeigen lasen. Letztendlich geht es darum, den Graph in Tkinter einzubinden.
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@möppi: dann mußt Du das Backend von Matplotlib so umstellen, dass es in ein TKInter-Canvas plottet. Matplotlib muß vorher wissen, wohin es was zeichnen soll.
Google liefert dazu auch als ersten Treffer http://matplotlib.org/examples/user_int ... in_tk.html
möppi
User
Beiträge: 39
Registriert: Samstag 29. März 2014, 09:18

Sirius3 hat geschrieben:@möppi: dann mußt Du das Backend von Matplotlib so umstellen, dass es in ein TKInter-Canvas plottet. Matplotlib muß vorher wissen, wohin es was zeichnen soll.
Google liefert dazu auch als ersten Treffer http://matplotlib.org/examples/user_int ... in_tk.html
Auf der Seite bin ich auch schon gelandet, aber was im Header alles drin steht sieht alles für mich nach Böhmischen Dörfern aus. Ich bin ja eher ein Anfänger in Python und weiß nicht genau, wie ich das auf mein Problem anwenden kann. Ich würde schon ganz gerne eine Funktion von einem anderen Skript aufrufen, um die Übersicht zu behalten.

Gruß
Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

Ob man figure Objekte auf Vorrat erzeugen kann, dass weiß ich nicht, aber ich weiß was Du tun musst um Matplotlib-Graphen in eigenen Widgets darzustellen. Selbst gemacht habe ich es zwar nur für das Qt-Backend, aber die prinzipelle Funktionsweise sollte für alle Backends gelten.

Wenn Du Matplotlib Graphen in Deiner eigenen Anwendung eingebettet anzeigen willst, dann musst Du Dich beim entsprechenden Backend einklinken. Der eingebaute FigureManager für die verschiedenen Backends macht ja immer ein neues Fenster für jeden Matplotlib-Graphen auf. Wenn Du aber etwas anderes haben willst, dann kannst Du von dem entsprechenden FigureManager ableiten und Deinen eigenen FigureManager im backend registrieren. So habe ich z.B. von FigureManagerQT einen eigenen FigureManager abgeleitet, der die Matplotlib Graphen als QDockwidget darstellt.

In dem Konstruktor von Deinem FigureManager bekommst Du kein figure Objekt, sondern ein Backend-spezifisches canvas Widget. Anstatt plt.show() kannst Du dann über canvas.draw() kontrollieren, wann das figure Objekt sich in das canvas Widget zeichnet. Dieses canvas Widget kannst Du dann auch auch in Deine eigenen Widgets einbetten.
a fool with a tool is still a fool, www.magben.de, YouTube
Antworten