matplotlib "setp"-befehl und was bewirkt er?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
alex2007
User
Beiträge: 40
Registriert: Montag 14. April 2014, 10:08

Ich habe eine Programmieraufgabe zu erledigen, bei der eine zeitliche entwicklung einer Kurve dargestellt wird. Als Hinweis ist angegeben, dass man für die dynamische Darstellung, die Daten mittels plt.setp neu setzen soll. Danach ist folgendes Beispiel angegeben:

Code: Alles auswählen

import numpy as np
from matplotlib import pyplot as plt

x = np.linspace(0.0, 2.0*np.pi, 100)
kurve= plt.plot(x, np.sin(x))
for phi in np.linspace(0.0, 6.0, 2):
    plt.setp(kurve[0], ydata=np.sin(x-phi))
    plt.draw()
plt.show()    
Nun meine Frage ganz simpel, was bewirkt dieses "setp" hier? Offensichtlich verschiebt er die eigentliche Kurve, aber ich versteh den Ablauf des Codes und wie er umgesetzt wird nicht wirklich. Ich dachte erst er berechnet jeweils für jedes Phi einen neuen Wert y, aber dann würde die Amplitude schwanken, was sie nicht tut. Kann mir jemand erklären, wie das Programm arbeitet. Leider find ich dazu Nichts wirklich passendes in der Matplotlib-Dokumentation!

Danke für Hilfe, im Vorraus!
BlackJack

@alex2007: Die Funktion ist dokumentiert: matplotlib.pyplot.setp().

Doch die Y-Daten werden in jedem Schleifendurchlauf neu berechnet.
alex2007
User
Beiträge: 40
Registriert: Montag 14. April 2014, 10:08

Ich verstehe die Dokumentation aber irgendwie nicht. So wie ich das Verstehe, bedeutet das einfach nur im Plot unterschiedlichen Linien, unterschiedliche Attribute zuzuteilen.

Ja aber wenn die Y-Werte immer wieder neu berechnet werden, wieso verschibt sich die Funktion in X-Richtung gegenüber der "Standardfunktion" sin(x)? Müsste nicht die Amplitude der Welle sich ändern?
BlackJack

@alex2007: Nein, warum sollte sich die Amplitude verändern?
alex2007
User
Beiträge: 40
Registriert: Montag 14. April 2014, 10:08

na wenn sich alle y-werte ändern? genauso bei jedem schleifendurchgang wird es neu berechnet sagtest du...wieso dann nur ein graph? kannst du mir einfach mal kruz erklären, was das programm mit dem code schritt für schritt macht?
BlackJack

@alex2007: Das Programm ist so ziemlich sinnlos weil da eine Kurve erzeugt wird, deren Werte in einer Schleife mehrfach verändert verändert werden und wo dann jedes mal die Vektordaten für einen neuen Plot erzeugt werden (`draw()`), aber nur die letzte Änderung wird dann auch tatsächlich angezeigt.

Und nur weil die `y`-Werte jedes mal neu berechnet werden, muss sich die Amplitude doch nicht ändern? Das hängt doch von der Formel ab und `sin()` ergibt immer Werte zwischen -1 und 1, egal womit man die Funktion füttert. Da müsste man schon das Ergebnis der Sinusberechnung mit irgendwas multiplizieren um diesen Wertebereich, und damit die Amplitude, zu verändern. Auch die Variablennamen legen das nahe, denn mit φ wird üblicherweise die Phasenverschiebung bezeichnet, und die hat nichts mit der Amplitude zu tun.
alex2007
User
Beiträge: 40
Registriert: Montag 14. April 2014, 10:08

hmmm. manchmal steh ich auch total auf dem schlauch. alles klar.

wie schaffe ich es, das jeder schritt der schleife angezeigt wird und nicht nur der letzte?
BlackJack

@alex2007: Ich schlage jetzt einfach mal die Beispiele in der Dokumentation vor: http://matplotlib.org/examples/animation/index.html
alex2007
User
Beiträge: 40
Registriert: Montag 14. April 2014, 10:08

da wird doch aber nirgend der setp-befehl verwendet...mir gehts ja darum, dass explizit als hinweis angegeben wurde, dass ich code wie oben verwenden soll um eine dynamische (zeitlich veränderliche) darstellung umzusetzen, deswegen wollte ich den code ja so genau verstehen.

danke für deine mühe
alex2007
User
Beiträge: 40
Registriert: Montag 14. April 2014, 10:08

oder ist damit nur die funktionsweise der "set"-funktionen allgemein gemeint und man animiert das ganze allá:

Code: Alles auswählen

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

fig, ax = plt.subplots()

x = np.arange(0, 2*np.pi, 0.01)        # x-array
line, = ax.plot(x, np.sin(x))

def animate(i):
    line.set_ydata(np.sin(x+i/10.0))  # update the data
    return line,

#Init only required for blitting to give a clean slate.
def init():
    line.set_ydata(np.ma.array(x, mask=True))
    return line,

ani = animation.FuncAnimation(fig, animate, np.arange(1, 200), init_func=init,
    interval=25, blit=True)
plt.show()
um eine dynamische darstellung zu zeigen?
BlackJack

@alex2007: Naja, der Schritt von `set_ydata()` in einem Beispiel aus der Dokumentation um die Daten zu setzen, zu `setp()` um mit dem `ydata`-Argument die Daten zu setzen ist doch relativ naheliegend. Wobei man sich da ja nun auch nicht sklavisch dran halten muss. Wenn es eine dedizierte Methode gibt um die Datenpunkte neu zu setzen, würde ich das der allgemeinen Methode vorziehen.
alex2007
User
Beiträge: 40
Registriert: Montag 14. April 2014, 10:08

Jetzt hab ich verstanden was das ganze soll. Ich danke dir wie verrückt :)

Sollte ich noch was haben, meld ich mich.
Antworten