Funktionsplots und Animationen mit Matplotlib

Das Modul matplotlib verfügt über eine fast unübersichtliche Vielzahl von Möglichkeiten physikalische Zusammenhänge im 2D- oder 3D-Raum zu visualisieren. Neben den üblichen statischen Darstellungen von mathematischen Funktionen in x-y-Koordinaten sind auch Animationen und interaktive Anwendungen implementierbar.

Funktionsplot

Das erste Beispiel zeigt, wie ein typischer Funktionsplot für eine 50 Hz-Wechselspannung erstellt werden kann.

import numpy as np
import matplotlib.pyplot as plt
t=np.arange(0,20,0.001)
#Funktionsdefinitionen
Ueff=[230,230] #Daten für Effektivwert
u=325*np.sin(2*np.pi*50*t/1000.0)
#Plot darstellen
plt.title("50 Hz Wechselspannung")
plt.plot(t,u,'b',lw=2,label="$Momentanwert: u(t)$") #Koordinaten berechnen
plt.plot([0,20],Ueff,'r--',label="$Effektivwert: 230V$")
plt.plot(5,325,'ro',label="$Spitzenwert:325V$")
plt.xlabel("t in ms")
plt.ylabel("u(t) in V")
#plt.legend(loc='upper right')
#plt.legend(loc='lower left')
plt.legend(loc='best')
plt.grid(color='g',ls='dashed',lw='0.5')
plt.savefig("abb_02_01.svg")
plt.show() #Plot anzeigen

Ausgabe

50 hz wechselspannung

Analyse

Mit der Methode plot(x,y,...) werden die x-y-Koordinaten der Funktion berechnet und intern im Arbeitsspeicher (RAM) abgespeichert. Die Methode show() bewirkt, dass der Funktionsplot auf dem Monitor angezeigt wird. Mit der Methode savefig(...) kann der Plot in einem gewünschten Bildformat auf der Festplatte gespeichert werden.

Animation

Das nächste Beispiel zeigt die Anwendung der matplotlib-Methode FuncAnimation(...). Eine Sinusschwingung bewegt sich von links nach rechts über den Bildschirm.

#Animation einer Sinusschwingung
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as ani

def f(x,k):
    return np.sin(x-k/20)

def v(k): 
    y.set_data(x,f(x,k))
    return y,

fig,ax=plt.subplots() #Erzeugen eines fig und ax Objektes
x=np.linspace(0,4*np.pi,200)
y, =ax.plot(x,f(x,0),lw=3,color='r')
#Animation
a=ani.FuncAnimation(fig,v,interval=20,blit=True) #1
plt.show()

Ausgabe

sinus animation

Analyse

Auffällig ist, dass man in #1 für die Animationsmethode ein Objekt erzeugen muss, obwohl dieses Objekt a im späteren Programmverlauf nicht benötigt wird. Wenn dieses Objekt nicht erzeugt wird, dann wird die Animation auch nicht ausgeführt. Es wird ein statisches Bild auf dem Monitor angezeigt.

Im Buch müssen die Quelltexte entsprechend geändert werden:
Seite 191, Zeile 17
Seite 193, Zeile 29
Seite 195, Zeile 28

Interaktion mit Schieberegler (engl. Slider)

Das dritte Beispiel zeigt den Einsatz des Sliders. Durch Verschieben der Slider können die Amplitude und die Frequenz der Sinusschwingung verändert werden.

#Interaktion mit slider
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.widgets import Slider,Button
fig,ax=plt.subplots() #fig und ax Objekt erzeugen
plt.subplots_adjust(left=0.2,bottom=0.25)
t=np.linspace(0.0,1.0,200)
a0=5 #Amplitude
f0=5 #Frequenz
s=a0*np.sin(2*np.pi*f0*t) #Signal
kurve, = plt.plot(t,s,lw=2,color='blue')
plt.axis([0, 1, -10, 10])
#Objekte für Steuerelemente platzieren
#linker Rand, unterer Rand, Länge, Höhe
xyAmp=plt.axes([0.25, 0.15, 0.65, 0.03])
xyFreq=plt.axes([0.25, 0.1, 0.65, 0.03])
xyReset=plt.axes([0.8,0.025,0.1,0.04])
#Objekte für Steuerelemente erzeugen
sldAmp=Slider(xyAmp,'Amplitude',1,10,valinit=a0,valstep=0.1) #1
sldFreq=Slider(xyFreq,'Frequenz',1,10,valinit=f0,valstep=0.1)#2
cmdReset=Button(xyReset,'Reset')

def update(val):
    A = sldAmp.val
    f = sldFreq.val
    kurve.set_ydata(A*np.sin(2*np.pi*f*t))
    fig.canvas.draw_idle()

def reset(event):
    sldFreq.reset()
    sldAmp.reset()
#Ereignisverarbeitung
sldAmp.on_changed(update)  #3
sldFreq.on_changed(update) #4
cmdReset.on_clicked(reset)
plt.show()

Ausgabe

wechselspannung verstellen

Analyse

In den Zeilen #1 und #2 werden zwei Sliderobjekte erzeugt. In den Zeilen #3 und #4 wird die Funktion update(...) aufgerufen. Die Methode on_changed(update) bewirkt, dass die Amplitude und die Frequenz geändert werden.

Besuchen Sie die Seite von Matplotlib.

Startseite NumPy SciPy SymPy VPython