2017-03-02 9 views
0

Ich versuche, ein Diagramm in Python zu erstellen, in dem die Daten, die geplottet werden, aktualisiert werden, während meine Simulation fortschreitet. In MATLAB ich mit dem folgenden Code tun könnte:Dynamisches Diagramm in Python

t = linspace(0, 1, 100); 
figure 
for i = 1:100 
x = cos(2*pi*i*t); 
plot(x) 
drawnow 
end 

Ich versuche matplotlib ‚s FuncAnimation Funktion im animation Modul zu tun dies in einer Klasse zu verwenden. Es ruft eine Funktion plot_voltage auf, die die Spannung nach jedem Zeitschritt in meiner Simulation neu berechnet. Ich habe es wie folgt eingerichtet:

import matplotlib.pyplot as plt 
import matplotlib.animation as animation 

def __init__(self): 
    ani = animation.FuncAnimation(plt.figure(2), self.plot_voltage) 
    plt.draw() 

def plot_voltage(self, *args): 
    voltages = np.zeros(100) 
    voltages[:] = np.nan 

    # some code to calculate voltage 

    ax1 = plt.figure(2).gca() 
    ax1.clear() 
    ax1.plot(np.arange(0, len(voltages), 1), voltages, 'ko-')` 

Wenn meine Simulation ausgeführt wird, erscheinen die Zahlen, aber nur einfrieren. Der Code läuft jedoch ohne Fehler. Kann mir bitte jemand sagen, was ich vermisse?

+0

Ich würde die dritte Version auf [diese Antwort] anzupassen (http://stackoverflow.com/questions/28074461/animating-growing -line-plot-in-python-matplotlib? rq = 1). – cphlewis

+0

Danke, @cphlewis. Das Problem mit dieser Lösung ist, dass, wenn ich eine andere Funktion habe, sagen wir 'count()', die einfach die positiven ganzen Zahlen hochzählt, und ich führe dies nach 'plt.show()' aus, 'count()' wird erst ausgeführt Ich schließe die Handlung. Das Ersetzen von 'plt.show()' durch 'plt.draw()' bewirkt, dass der Plot überhaupt nicht angezeigt wird, aber dann läuft 'count()'. Wie kann ich das Diagramm aktualisieren, während das Programm fortgesetzt wird und 'count()' läuft? Mein Backend ist Qt5Agg mit aktiviertem interaktivem Modus. –

+0

In der dritten Lösung würde 'update()' beide Ihre 'count()' aufrufen, so dass das Plotten fortgesetzt wird. – cphlewis

Antwort

1

Dies ist eine Übersetzung des Matlab-Code in matplotlib FuncAnimation mit:

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

t = np.linspace(0, 1, 100) 
fig = plt.figure() 
line, = plt.plot([],[]) 

def update(i): 
    x = np.cos(2*np.pi*i*t) 
    line.set_data(t,x) 

ani = animation.FuncAnimation(fig, update, 
       frames=np.linspace(1,100,100), interval=100) 
plt.xlim(0,1) 
plt.ylim(-1,1) 
plt.show() 
+0

Danke, aber Ihr Kommentar oben ist richtig - ich hätte klarer sein sollen. Ich habe eine Simulation, in der Parameter eines Objekts aktualisiert werden. Jedes Mal, wenn ein Update durchgeführt wird, möchte ich ihre Werte grafisch darstellen. [Hier] (https://gist.github.com/anonymous/e5a073a08286397368804526dcafe95e) ist ein minimales Beispiel. Ich muss nicht unbedingt das 'animation' Paket verwenden. Ich habe es nur versucht. Wenn ich dieses Beispiel ausführen, werden die Figuren nicht gerendert und das Fenster reagiert nicht. Wenn ich das Terminal mit Strg + C betätige, plotten die Figuren, aber das Programm stoppt. Irgendwelche Gedanken über den besten Weg, dies zu tun? –

+0

Ich kommentiert unten [der Code bei GiHubGist] (https://gist.github.com/anonymous/e5a073a08286397368804526dcafe95e?signup=true). – ImportanceOfBeingErnest