2014-12-19 12 views
7

È necessario disegnare sottotrame di una figura tramite iterazioni di loop; ogni iterazione chiama una funzione definita in un altro modulo (= un altro file py), che disegna una coppia di sottotrame. Ecco quello che ho provato - e purtroppo non funziona:popolamento di sottotrame matplotlib attraverso un loop e una funzione

1) prima del ciclo, creare una figura con il numero adeguato di righe e 2 colonne:

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

2) all'interno del ciclo, al numero di iterazioni iter_nber, chiamare la funzione di disegno ogni sottotrama:

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

3) la funzione in questione è fondamentalmente come questo; ogni iterazione crea una coppia di sottotrame sulla stessa riga:

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 

Questo non funziona. Finisco con una figura vuota alla fine del ciclo. Ho provato varie combinazioni di quanto sopra, come lasciare solo axarr nell'argomento di ritorno della funzione, inutilmente. Ovviamente non capisco la logica di questa figura e delle sue sottotrame.

Eventuali suggerimenti molto apprezzati.

+0

Potrebbe fornire un esempio di lavoro? – hitzg

+0

grazie hitzg. Speravo che il codice semplificato ti aiutasse a capire quale fosse il mio problema. Il codice reale è molto lungo e pieno di dettagli completamente estranei alla domanda in questione. – Charles

+2

Una cosa che sembra strana è l'indice '2' in 'axarr [iter_nber, 2]'. quello dovrebbe gettare un errore – hitzg

risposta

10

Il codice che hai pubblicato sembra in gran parte corretto. A parte l'indicizzazione, come citato da @hitzg, nulla di ciò che stai facendo sembra terribilmente fuori dall'ordinario.

Tuttavia, non ha molto senso restituire la matrice di figure e assi dalla funzione di stampa. (Se hai bisogno di accedere all'oggetto figure, puoi sempre farlo tramite ax.figure.) Non cambierà nulla per passarli e restituirli, comunque.

Ecco un breve esempio del tipo di cosa sembra che tu stia cercando di fare. Forse aiuta a chiarire un po 'di confusione?

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

grazie Joe sì, questo è utile. Vedo in particolare che la tua funzione "trama" non restituisce nulla. Seguirò questa logica. Inoltre, mi stavo chiedendo se il fatto che la mia funzione di tracciamento si trovi in ​​un altro file possa avere un'influenza? Non vedo perché, ma potrei sbagliarmi. grazie ancora – Charles

+0

@Charles - Finché la funzione di tracciamento viene importata correttamente dall'altro file, non dovrebbe avere importanza. (Ad es. Se si tratta di una funzione chiamata 'trama' in' blah.py', quindi dovrai importare 'import blah' e' blah.plot (...) ', piuttosto che solo' trama (...) '.) Per quanto riguarda cosa restituire (o non restituire) , una convenzione comune è quella di restituire gli artisti (es. linee, ecc.) che sono tracciati. Per exmaple, 'line = ax.plot (...); linea di ritorno'. Questo è puramente opzionale, però. È solo per una potenziale facilità d'uso in seguito. –

Problemi correlati