2013-11-14 12 views
5

Uso il notebook iPython molto insieme a matplotlib e mentre ci sono molti casi in cui sono contento che visualizza automaticamente le immagini quando chiamo imshow() ci sono momenti in cui vorrei evitare questo comportamento.Notebook iPython: come impedire l'output dell'immagine su imshow()?

In particolare, eseguo il ciclo su un array molto grande e genera una figura in matplotlib per ogni elemento che deve essere salvato su disco. Come parte della creazione di questa figura, devo chiamare imshow() per disegnare un'immagine esistente (nel mio caso lo screenshot di una mappa) sull'asse per poi disegnare altro materiale in più. Ogni volta che chiamo imshow come parte del processo, la figura finale viene visualizzata in linea nel notebook iPython, come posso impedirlo?

Il mio codice simile a questa:

import matplotlib as plt 
fig = plt.pyplot.figure(figsize=(20,20)) 
im2 = plt.pyplot.imread('/some/dir/fancy-map.png') 

# Magic to calculate points, x_min etc. 

fig.clf() 
ax = fig.gca(xlim=(x_min, x_max), ylim=(y_min, y_max)) 
ax.imshow(im2, extent=(4, 4.5746, 42.5448, 43.3791), aspect=1.5) 
raster = ax.imshow(points, vmin = 0, vmax=maxval, extent=(x_min, x_max, y_min, y_max), aspect=1.5, origin='lower') 
fig.colorbar(raster) 
ax.set_title('coordinates plot') 

fig.savefig("fancy-annotated-map.png", bbox_inches=0) 

risposta

3

provare a spostare questo in una funzione, e all'inizio della funzione fare pylab.ioff() e al termine rientro pylab.ion():

# Obvs add arguments so you can pass in your data and plot choices. 
def make_img(): 
    pylab.ioff() 

    import matplotlib as plt 
    fig = plt.pyplot.figure(figsize=(20,20)) 
    im2 = plt.pyplot.imread('/some/dir/fancy-map.png') 

    # Magic to calculate points, x_min etc. 

    fig.clf() 
    ax = fig.gca(xlim=(x_min, x_max), ylim=(y_min, y_max)) 
    ax.imshow(im2, extent=(4, 4.5746, 42.5448, 43.3791), aspect=1.5) 
    raster = ax.imshow(points, 
         vmin = 0, 
         vmax=maxval, 
         extent=(x_min, x_max, y_min, y_max), 
         aspect=1.5, 
         origin='lower') 
    fig.colorbar(raster) 
    ax.set_title('coordinates plot') 
    fig.savefig("fancy-annotated-map.png", bbox_inches=0) 

    pylab.ion() 
  1. Si presume che si stia utilizzando la funzione solo in IPython, oppure che pylab sia sempre importato. Meglio avvolgere un try ... except attorno ad esso in modo che la funzione possa essere utilizzata altrove.

  2. Dai un'occhiata alla the template for making your own IPython Magic functions (le chiamate % o %% funzione, come %cpaste). Un buon approccio a questo sarebbe creare la tua magia, come %imnoshow o qualcosa del genere, che racchiuda solo la parte che richiama imshow, in modo da eseguire la gestione in linea dell'output imshow senza dover vedere l'output. Dato che la tua domanda non ha a che fare con un'interfaccia generale, ma piuttosto questa specifica, non cercherò di implementarla qui, ma spero che il link sopra dovrebbe essere sufficiente per poter implementare qualcosa se necessario.

  3. Un altro approccio è quello di seguire le istruzioni per realizzare il proprio IPython configuration environment, compreso avere qualche particolare file .py pieno delle proprie importazioni e le definizioni di classe helper, ecc quindi posizionare le proprie funzioni speciali plottaggio lì in modo che siano caricati all'avvio e sono disponibili nell'ambito globale in IPython. Consiglio vivamente questo per alcuni motivi: (a) è possibile scrivere test di unità per le proprie funzioni di supporto e persino testarli facilmente ogni volta che si avvia IPython, se lo si desidera! (b) Ciò consente di controllare più facilmente la versione e incapsulare la logica delle funzioni di supporto che si richiedono spesso. (c) Ottieni il beneficio della funzione "Stai semplicemente lì" senza aver bisogno di renderla una funzione magica o importarla in seguito.

+0

Perfetto, grazie! Finito per usare il 'pylab.ioff()' per ora ma sicuramente cercherò di farne una funzione magica iPython – Robin