Seite 1 von 1

Graph als Rückgabewert

Verfasst: Freitag 7. November 2014, 15:00
von möppi
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ß

Re: Graph als Rückgabewert

Verfasst: Freitag 7. November 2014, 15:15
von 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.

Re: Graph als Rückgabewert

Verfasst: Freitag 7. November 2014, 15:24
von möppi
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.

Re: Graph als Rückgabewert

Verfasst: Freitag 7. November 2014, 15:51
von Sirius3
@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

Re: Graph als Rückgabewert

Verfasst: Freitag 7. November 2014, 15:58
von möppi
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ß

Re: Graph als Rückgabewert

Verfasst: Freitag 7. November 2014, 16:11
von MagBen
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.