2014-12-19 9 views
7

Ich muss Unterschritte einer Figur durch Schleifen Iterationen zeichnen; Jede Iteration ruft eine Funktion auf, die in einem anderen Modul definiert ist (= eine andere Py-Datei), die ein Paar Unterplots zeichnet. Hier ist, was ich versuchte - und leider nicht funktioniert:befüllen Matplotlib Subplots durch eine Schleife und eine Funktion

1) Vor der Schleife, erstellen Sie eine Figur mit der ausreichenden Anzahl von Zeilen und 2 Spalten:

import matplotlib.pyplot as plt  
fig, axarr = plt.subplots(nber_rows,2) 

2) Innerhalb der Schleife bei Iterationszahl iter_nber, rufen die Funktion jedes subplot Zeichnung:

fig, axarr = module.graph_function(fig,axarr,iter_nber,some_parameters, some_data) 

3) die Funktion in Frage ist im Grunde wie folgt; jeder Iteration erzeugt ein Paar Nebenhandlungen auf der gleichen Zeile:

def graph_function(fig,axarr,iter_nber,some_parameters, some_data): 

    axarr[iter_nber,1].plot(--some plotting 1--) 
    axarr[iter_nber,2].plot(--some plotting 2--) 

    return fig,axarr 

Dies funktioniert nicht. Ich habe am Ende der Schleife eine leere Figur. Ich habe verschiedene Kombinationen der oben genannten ausprobiert, wie nur axarr im Argument der Funktion verlassen, ohne Erfolg. Offensichtlich verstehe ich die Logik dieser Figur und ihrer Subplots nicht.

Alle Vorschläge sehr geschätzt.

+0

Könnten Sie ein funktionierendes Beispiel? – hitzg

+0

danke hitzg. Ich hatte gehofft, dass der vereinfachte Code Ihnen helfen würde, zu sehen, was mein Problem ist. Der echte Code ist sehr, sehr lang und voller Details, die völlig unabhängig von der vorliegenden Frage sind. – Charles

+2

Eine Sache, die seltsam aussieht, ist der Index '2' in' axarr [iter_nber, 2] '. das sollte einen Fehler werfen – hitzg

Antwort

10

Der Code, den Sie gepostet haben, scheint weitgehend korrekt zu sein. Abgesehen von der Indizierung, wie @hitzg erwähnt hat, sieht nichts, was du machst, schrecklich ungewöhnlich aus.

Es ist jedoch wenig sinnvoll, das Figuren- und Achsen-Array von Ihrer Plotfunktion zurückzugeben. (Wenn Sie Zugriff auf das Figurenobjekt benötigen, können Sie es immer durch ax.figure bekommen.) Es wird nichts geändert, um sie weiterzugeben und zurückzugeben.

Hier ist ein schnelles Beispiel für die Art der Sache, es klingt wie Sie versuchen zu tun. Vielleicht hilft es etwas Verwirrung zu klären?

import numpy as np 
import matplotlib.pyplot as plt 

def main(): 
    nrows = 3 
    fig, axes = plt.subplots(nrows, 2) 

    for row in axes: 
     x = np.random.normal(0, 1, 100).cumsum() 
     y = np.random.normal(0, 0.5, 100).cumsum() 
     plot(row, x, y) 

    plt.show() 

def plot(axrow, x, y): 
    axrow[0].plot(x, color='red') 
    axrow[1].plot(y, color='green') 

main() 

enter image description here

+0

Danke Joe ja, das ist nützlich. Ich sehe insbesondere, dass deine Funktion "Plot" gar nichts zurückgibt. Ich werde dieser Logik folgen. Außerdem habe ich mich gefragt, ob die Tatsache, dass meine Plotfunktion in einer anderen Datei ist, einen Einfluss haben könnte? Ich verstehe nicht warum, aber ich kann mich irren. Nochmals vielen Dank – Charles

+0

@Charles - Solange Ihre Plotfunktion ordnungsgemäß aus der anderen Datei importiert wird, sollte es keine Rolle spielen. (Z. B. wenn es sich um eine Funktion namens 'plot' in' blah handelt.py ', dann musst du' import blah' und 'blah.plot (...)' machen, anstatt nur 'plot (...)'.) Was soll zurückgegeben werden (oder nicht zurück) Eine gängige Konvention besteht darin, die Künstler (z. B. Linien usw.), die geplottet wurden, zurückzugeben. Zum Beispiel, line = ax.plot (...); Rückleitung ". Das ist jedoch rein optional. Es ist nur für die mögliche Benutzerfreundlichkeit später. –