2014-11-17 24 views
7

Ho problemi con matplotlib che insiste a visualizzare una figura wnidow anche quando non ho chiamato show().Matplotlib non è in grado di sopprimere la finestra di figura

La funzione in questione è:

def make_plot(df): 
    fig, axes = plt.subplots(3, 1, figsize=(10, 6), sharex=True) 
    plt.subplots_adjust(hspace=0.2) 

    axes[0].plot(df["Date_Time"], df["T1"], df["Date_Time"], df["T2"]) 
    axes[0].set_ylabel("Temperature (C)") 
    axes[0].legend(["T1", "T2"], bbox_to_anchor=(1.12, 1.1)) 
    axes[1].semilogy(df["Date_Time"], df["IGP"], df["Date_Time"], df["IPP"]) 
    axes[1].legend(["IGP", "IPP"], bbox_to_anchor=(1.12, 1.1)) 
    axes[1].set_ylabel("Pressure (mBar)") 
    axes[2].plot(df["Date_Time"], df["Voltage"], "k") 
    axes[2].set_ylabel("Voltage (V)") 
    current_axes = axes[2].twinx() 
    current_axes.plot(df["Date_Time"], df["Current"], "r") 
    current_axes.set_ylabel("Current (mA)") 
    axes[2].legend(["V"], bbox_to_anchor=(1.15, 1.1)) 
    current_axes.legend(["I"], bbox_to_anchor=(1.14, 0.9)) 

    plt.savefig("static/data.png") 

dove DF è un dataframe creati utilizzando i panda. Questo dovrebbe essere sullo sfondo di un server web, quindi tutto quello che voglio è che questa funzione faccia cadere il file nella directory specificata. Tuttavia, quando viene eseguito, esegue questa operazione, quindi apre una finestra di figura e rimane bloccata in un ciclo, impedendomi di ricaricare la pagina. Mi manca qualcosa di ovvio?

EDIT: Ho dimenticato di aggiungere, sto eseguendo Python 2.7 su Windows 7, 64 bit.

+3

si consiglia di verificare se si sta eseguendo in [modalità interattiva] (http://matplotlib.org/faq/usage_faq.html#what-is -interactive-mode). – Evert

+2

Inoltre, quale back-end usi? Hai scelto un back-end non gui? – Evert

+0

Ciao @Evert. Ho provato a usare plt.ioff() per forzare la modalità interattiva, ma questo non ha aiutato. O meglio, ha permesso al codice di funzionare due volte, invece di una sola volta (generando due finestre di figure prima di rimanere bloccate). Puoi spiegare come dovrei scegliere un back-end non-gui? –

risposta

12

Fase 1

Verificare se si sta eseguendo in . L'impostazione predefinita è non interattiva, ma si può mai sapere:

>>> import matplotlib as mpl 
>>> mpl.is_interactive() 
False 

È possibile impostare la modalità esplicitamente a non interattiva utilizzando

>>> from matplotlib import pyplot as plt 
>>> plt.ioff() 

Dal momento che il valore predefinito è non interattiva, questo è probabilmente non il problema

Fase 2

Assicurarsi che il back-end è un backend non-gui. È la differenza tra l'utilizzo di Agg rispetto a TkAgg, WXAgg, GTKAgg ecc., Quest'ultimo essendo i backend gui, mentre Agg è un backend non-gui.

È possibile set the backend in diversi modi:

  • nel file di configurazione matplotlib; trovare la riga che inizia con backend:

    backend: Agg 
    
  • nella parte superiore del vostro programma con la funzione matplotlib globale use:

    matplotlib.use('Agg') 
    
  • importare la tela direttamente dal backend corretto; questo è molto utile in "modalità" non in Pyplot (stile OO), che è quello che uso spesso, e per uno stile di utilizzo del server web, che alla fine può rivelarsi il migliore (dato che è un po 'diverso da quello sopra, ecco un breve esempio conclamato):

    import numpy as np 
    from matplotlib.figure import Figure 
    from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas 
    figure = Figure() 
    canvas = FigureCanvas(figure) 
    axes = figure.add_subplot(1, 1, 1) 
    axes.plot(x, np.sin(x), 'k-') 
    canvas.print_figure('sine.png')