2017-12-17 1 views
0

Ich möchte eine Funktion haben, die bei Aufruf eines vorhandenen Diagramms Diagramme hinzufügt. Gerade jetzt zeigt mein leerer Plot an, aber die aufgerufene Funktion scheint nie zu passieren, da sie wartet, bis ich das Chartfenster schließe. Das Programm endet dann, ohne das Diagrammfenster erneut zu öffnen.Hinzufügen eines zweiten Diagramms zu einem vorhandenen Matplotlib-Diagramm

import numpy as np 
import matplotlib.pyplot as plt 
import time 

fig, ax = plt.subplots() 
plt.show() 
def plotting(slope, intercept): 

    x_vals = np.array(ax.get_xlim()) 
    y_vals = intercept + slope * x_vals 
    ax.plot(x_vals, y_vals, '-') 
    plt.show() 

plotting(10,39) 
time.sleep(1) 
plotting(5,39) 

Antwort

3

plt.show() soll am Ende des Skripts einmal aufgerufen werden. Es wird blockiert, bis das Plotfenster geschlossen wird.

Sie können den interaktiven Modus (plt.ion()) verwenden und das Diagramm in Zwischenschritten zeichnen (plt.draw()). Verwenden Sie time.sleep() nicht, um eine Pause zu erhalten, da die Anwendung dadurch buchstäblich schlafen lässt (was möglicherweise zu eingefrorenen Fenstern führt). Verwenden Sie stattdessen plt.pause(). Am Ende können Sie den interaktiven Modus wieder ausschalten (plt.ioff()) und schließlich plt.show() anrufen, damit die Grafik offen bleibt.

import numpy as np 
import matplotlib.pyplot as plt 

plt.ion() 
fig, ax = plt.subplots() 

def plotting(slope, intercept): 

    x_vals = np.array(ax.get_xlim()) 
    y_vals = intercept + slope * x_vals 
    ax.plot(x_vals, y_vals, '-') 
    plt.draw() 

plotting(10,39) 
plt.pause(1) 
plotting(5,39) 

plt.ioff() 
plt.show() 
2

Senden Sie das optionale Schlüsselwort Argument block=False-plt.show().

Erläuterung: Das Plotfenster blockiert die Fortsetzung des Programms. Durch das Senden dieses Arguments kann das Programm fortgesetzt werden. Beachten Sie, dass, wenn Sie nur dieses Argument verwenden und das Programm endet, das Plotfenster geschlossen wird. Daher möchten Sie vielleicht am Ende des Programms plt.show(block=True) oder plt.waitforbuttonpress() anrufen.


Persönlich würde ich für das Hinzufügen eines Block-Argument für die eigene Funktion gehen:

def plotting(slope, intercept, block=True): 

    x_vals = np.array(ax.get_xlim()) 
    y_vals = intercept + slope * x_vals 
    ax.plot(x_vals, y_vals, '-') 
    plt.show(block=block) 

plotting(10,39,False) 
time.sleep(1) 
plotting(5,39) 
Verwandte Themen