Mathplotlib Slider verknüpfen

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
felopy
User
Beiträge: 17
Registriert: Mittwoch 3. Juni 2015, 08:55

Hallo
ich würde gerne mehrere Slider in meine Plot einbauen, sodass ich die x-Achse verkleinern/vergrößern kann und auch zwischen Teilabschnitten in Datensätzen wechseln kann.

Erste Hilfe fand ich hier : http://matplotlib.org/examples/widgets/slider_demo.html
Allerdings scheitert es am meinem Verständnis es auf meinen Code umzubauen.

Mein Plot wird hier erstellt:

Code: Alles auswählen

####### Hier hole ich aus einem Datensatz Blöcke mit je 8192 Werten raus

def _test1(kanal,block):
  block = block -1
  kanal = kanal-1
  s = 8192*kanal+(block*4*8192)
  e = 8192*kanal+8192+(block*4*8192)
  return b1[s:e]

#### Zeitachse, Umrechnen in us
for i in range(0,8192):  
  d = 0.05*i
  time.append(round(d, 2))
#####

##########################################Kanal und Block zum Plotten bestimmen, und Abschnitt auf x-Achse wählen
Plot_Eins = _test1(1,1) 
Plot_Zwei = _test1(1,2)  
Plot_Drei = _test1(1,3) 
startzeit = 0 ## in us 
endzeit = 400 ## in us
#######################################################################


#### Plotten
f, (ax1, ax2, ax3, ax4) = plt.subplots(4, sharex=True, sharey=True)
ax1.set_title('Vergleich')

ax1.plot(time, Plot_Eins, color = "r", label = testname1+ ": Amplitude = "+str(_amplitude(Plot_Eins))+"mV")
ax1.set_ylabel('mV')
ax1.legend(bbox_to_anchor=(0.4, 1), loc=2, borderaxespad=0.)

ax2.plot(time, Plot_Zwei, color = "b", label = testname2+ ": Amplitude = "+str(_amplitude(Plot_Zwei))+"mV")
ax2.set_ylabel('mV')
ax2.legend(bbox_to_anchor=(0.4, 1), loc=2, borderaxespad=0.)

ax3.plot(time, Plot_Drei, color = "g", label = testname3+ ": Amplitude = "+str(_amplitude(Plot_Drei))+"mV")
ax3.legend(bbox_to_anchor=(0.4, 1), loc=2, borderaxespad=0.)
ax3.set_ylabel('mV')

ax4.plot(time, Plot_Eins, color = "r")
ax4.plot(time, Plot_Zwei, color = "b")
ax4.plot(time, Plot_Drei, color = "g")
ax4.set_ylabel('mV')


##x-Achsenlimits festlegen
if (endzeit-startzeit <= 10):
  set_ticks = 1
elif (endzeit-startzeit <= 50):
    set_ticks = 5
elif (endzeit-startzeit <= 100):
    set_ticks = 10
else:
  set_ticks = 20
  
plt.xlim([startzeit, endzeit])
xticks = np.arange(startzeit, endzeit+set_ticks, set_ticks)
plt.xticks(xticks)
plt.xlabel('Zeit in us')

Das Erstellen der Slider an sich ist kein Problem, allerding weiß ich nicht, wie die update Funktion (wie in dem Link) auf mein Problem bezogen aussehen muss.

Code: Alles auswählen

def update(val):
    amp = samp.val
    freq = sfreq.val
    l.set_ydata(amp*np.sin(2*np.pi*freq*t))  ###set_ydata ???
    fig.canvas.draw_idle()				###canvas.draw ??? brauch ich das?
sfreq.on_changed(update)
samp.on_changed(update)
Ich brauche zwei Slider für die Werte "startzeit" "endzeit" um im Plot sozusagen zoomen zu können und (erstmal) einen um bei "Plot_Eins = _test1(1,1)" die Ziffer x (1,x) verändern zu können. Natürlich soll sich der Plot daraufhin entsprechend anpassen.. Aber hier weiß ich einfach nicht weiter :(

Kann jemand helfen?
felopy
User
Beiträge: 17
Registriert: Mittwoch 3. Juni 2015, 08:55

War dann doch recht einfach, aber es geht sicher noch schöner

Code: Alles auswählen

def update_x(val):
    startzeit = s_startzeit.val 
    endzeit =  s_endzeit.val
    ax1.set_xlim(startzeit, endzeit) 


s_startzeit.on_changed(update_x)
s_endzeit.on_changed(update_x)
Das ändern des Datensatzes ist allerdings nach wie vor ein Problem
Antworten