2014-11-17 10 views
7

Ich habe Probleme mit Matplotlib darauf bestehen, eine Zahl wnidow anzuzeigen, auch wenn ich Show() nicht aufgerufen habe.Matplotlib kann Zahlenfenster nicht unterdrücken

Die Funktion in Frage:

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") 

wo df ein Datenrahmen ist Pandas erstellt. Dies sollte im Hintergrund eines Webservers sein, also will ich nur, dass diese Funktion die Datei in das angegebene Verzeichnis löscht. Wenn es jedoch ausgeführt wird, macht es das, und zieht dann ein Zahlenfenster hoch und bleibt in einer Schleife stecken, was mich daran hindert, die Seite neu zu laden. Fehle ich etwas Offensichtliches?

EDIT: Forgot hinzufügen, ich bin Python 2.7 auf Windows 7, 64 Bit ausgeführt.

+3

möglicherweise möchten Sie überprüfen, ob Sie in [interaktiven Modus] laufen lassen (http://matplotlib.org/faq/usage_faq.html#what-is -interaktiver Modus). – Evert

+2

Auch, welches Backend benutzen Sie? Haben Sie ein Nicht-GUI-Backend ausgewählt? – Evert

+0

Hallo @Evert. Ich habe versucht, mit plt.ioff() den interaktiven Modus auszuschalten, aber das hat nicht geholfen. Oder besser gesagt, der Code wurde doppelt statt nur einmal ausgeführt (zwei Zahlenfenster werden erzeugt, bevor er stecken bleibt). Können Sie mir erklären, wie ich ein Nicht-GUI-Backend wählen soll? –

Antwort

12

Schritt 1

Überprüfen Sie, ob Sie in laufen. Der Standardwert ist nicht interaktiv, aber man kann nie wissen,:

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

Sie den Modus

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

Da die Standard-nicht-interaktiv ist explizit nicht-interaktive setzen kann, ist dies wahrscheinlich nicht das Problem.

Schritt 2

Stellen Sie sicher, Ihre Backend ein Nicht-GUI-Backend ist. Es ist der Unterschied zwischen der Verwendung von Agg gegenüber TkAgg, WXAgg, GTKAgg etc, wobei die letztere Gui Backends ist, während Agg ist ein Nicht-GUI-Backend.

Sie können set the backend in eine Reihe von Möglichkeiten:

  • in Ihrer matplotlib Konfigurationsdatei; finden Sie die Zeile mit backend Start:

    backend: Agg 
    
  • an der Spitze des Programms mit der globalen matplotlib Funktion use:

    matplotlib.use('Agg') 
    
  • die Leinwand direkt aus dem richtigen Backend importieren; Dies ist am nützlichsten im nicht-pyplot "Modus" (OO-Stil), was ich oft verwende, und für einen Webserver-Nutzungsstil, der sich am Ende als der beste erweisen kann (da dies ein bisschen anders als oben ist, hier ist eine ausgewachsene kurzes Beispiel):

    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')