Punkt mit Slider bewegen

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
maddin1991
User
Beiträge: 2
Registriert: Dienstag 24. April 2018, 09:57

Hallo,

ich bin neu hier und lerne seit einigen Wochen Python (2.7). Jetzt bin ich leider auf ein Problem gestoßen, welches ich alleine nicht lösen kann.

Ich möchte einen Punkt plotten und seinen Y-Wert über einen Slider steuern. Das Plotten und der Slider funktioniert, nur leider bewegt sich der Punkt nicht, weil der Wert des Sliders nicht an die Plot-Funktion übergeben wird.

Hier mein Code:

Code: Alles auswählen

import matplotlib.pyplot as plt
import time
from matplotlib.widgets import Slider

plt.ion()
fig, ax = plt.subplots()
punkt, = ax.plot(0,0,marker='o')
plt.show()

sollwert=0

def slidevent(value):
	sollwert = value
	return sollwert

sliderax = fig.add_axes([0.2, 0.02, 0.6, 0.03], axisbg='white')
slider = Slider(sliderax, 'Value', 0, 10, valinit=5)
slider.on_changed(slidevent)
slider.drawon = False

while True:
	plt.pause(1)
	punkt.set_ydata(sollwert)
	plt.draw()
Der "Sollwert" ist der Y-Wert, der vom Slider an den Punkt übergeben werden soll. Wieso funktioniert das so nicht?

Ich habe das ganze auch noch mit der FuncAnimation versucht, leider mit dem selben Ergebnis. Hier der Code:

Code: Alles auswählen

import matplotlib.pyplot as plt
import matplotlib.animation as animation
from matplotlib.widgets import Slider

fig, ax = plt.subplots()
ax.set_xlim(0, 5)
ax.set_ylim(0, 5)
punkt, = ax.plot(2.5,2.5,marker='o')

global sollwert
sollwert = 2.5

def slidevent(value):
	sollwert = value
	return sollwert

sliderax = fig.add_axes([0.2, 0.02, 0.6, 0.03], axisbg='white')
slider = Slider(sliderax, 'Value', 0, 10, valinit=2.5)
slider.on_changed(slidevent)
slider.drawon = False

def update(i, soll):
	punkt.set_ydata(soll)
	return punkt,

ani = animation.FuncAnimation(fig, update, fargs=(sollwert,), interval=100)
plt.show()
Hoffentlich kann mir jemand helfen. Danke!

Gruß
Martin
maddin1991
User
Beiträge: 2
Registriert: Dienstag 24. April 2018, 09:57

Ich habe es jetzt selber gelöst. Ich habe die Funktion "slidevent" einfach weggelassen und den Sollwert durch "slider.val" ersetzt. So funktioniert es dann für beide Codevarianten. Bei der Variante mit FuncAnimation muss funktioniert es allerdings auch nur ohne "fargs=(slider.val)".

Trotzdem wäre ich über eine Erklärung dankbar, weshalb das mit dem ursprünglichen Code nicht funktioniert hat.
Antworten