numpy
numpy

Reputation: 89

Implementing ipywidget slider for time

I am trying to create a slider for time in Jupyter Notebook using ipywidgets. I would like to take the tabulated experimental data (see figure below) and control the value bounds with the help of a slider. The graph should be a force-displacement graph, evolving in time:

enter image description here

This is my python code:

from ipywidgets import IntSlider, interact, FloatSlider

u = fdat1['C_1_Weg_R4[mm]'].values
f = fdat1['C_1_Kraft_R4[kN]'].values
t = fdat1['S/No'].values

@interact(t = IntSlider(min = 0, max = max(fdat0['S/No'].values)))
def aa_(t):
    plt.plot(f[t],u[t])
    plt.grid()
    plt.xlabel("force [kN]")
    plt.ylabel("displacement [mm]")
    plt.title("Load-displacement curve for \nexperiment")

fdat1 is the name of the tabulated data. I have also considered using "C_1_Zeit[s]" column as my slider values, but these are not integer values.

The problem is that nothing gets plotted, but the slider works and the graph changes scale.

I have been searching online for some time now and would really appreciate some help.

Thank you in advance!

Tabulated experimental data

Edit:

from ipywidgets import IntSlider, interact, FloatSlider

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

df = pd.DataFrame.from_records(
    [np.linspace(0,30, num=30), np.linspace(0,20, num=30), ]).T

df.columns=['A', 'B']

@interact(t = IntSlider(min = 0, max = 21))
def aa_(t):
    plt.scatter(df['A'], df['B'])
    plt.grid()
    plt.xlabel("force [kN]")
    plt.ylabel("displacement [mm]")
    plt.title("Load-displacement curve for \nexperiment")
    plt.xlim(0, 30)
    plt.ylim(0, 30)

Upvotes: 0

Views: 1490

Answers (2)

numpy
numpy

Reputation: 89

So, basically, this should have been the correct code:

from ipywidgets import IntSlider, interact, FloatSlider

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt


u = fdat1['C_1_Weg_R4[mm]'].values     #loads displacement values from fdat1
f = fdat1['C_1_Kraft_R4[kN]'].values   #loads force values from fdat1


df = pd.DataFrame.from_dict([u,f]).T   #creates a dataframe

df.columns=['A', 'B']

@interact(t = IntSlider(min = 0, max = df.shape[0]))   #interactive scatterplot with a slider for time
def scatterplot_(t):
    plt.scatter(df.loc[0:t,'A'], df.loc[0:t,'B'])
    plt.grid()
    plt.xlabel("force [kN]")
    plt.ylabel("displacement [mm]")
    plt.title("Load-displacement curve for \nexperiment")
    plt.xlim(-5, 5)
    plt.ylim(-25, 25)

Upvotes: 0

ac24
ac24

Reputation: 5565

Inside your plotting function, create a slice of your results dataframe that slices based on the slider value.

from ipywidgets import IntSlider, interact, FloatSlider

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

results = pd.DataFrame.from_records(
    [np.linspace(0,30, num=30), np.linspace(0,20, num=30), ]).T

results.columns=['A', 'B']

@interact(t = IntSlider(min = 0, max = 21))
def aa_(t):
    df = results.iloc[:t]    # make the slice here
    plt.scatter(df['A'], df['B'])
    plt.grid()
    plt.xlabel("force [kN]")
    plt.ylabel("displacement [mm]")
    plt.title("Load-displacement curve for \nexperiment")
    plt.xlim(0, 30)
    plt.ylim(0, 30)

Upvotes: 1

Related Questions