Реализация слайдера ipywidget для времени - PullRequest
0 голосов
/ 29 марта 2020

Я пытаюсь создать слайдер для времени в Jupyter Notebook с помощью ipywidgets. Я хотел бы взять табличные экспериментальные данные (см. Рисунок ниже) и контролировать границы значений с помощью ползунка. График должен представлять собой график смещения силы, развивающийся во времени:

enter image description here

Это мой python код:

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 - имя табличных данных. Я также рассмотрел использование столбца «C_1_Zeit [s]» в качестве значений ползунка, но это не целочисленные значения.

Проблема в том, что ничего не отображается, но слайдер работает, а график меняет масштаб.

Я уже некоторое время ищу в Интернете и буду очень признателен за помощь.

Заранее спасибо!

Tabulated experimental data

Редактировать:

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)

Ответы [ 2 ]

1 голос
/ 01 апреля 2020

Внутри вашей функции построения графика создайте фрагмент вашего results кадра данных, который будет разрезать на основе значения слайдера.

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)
0 голосов
/ 07 апреля 2020

Итак, в основном это должен был быть правильный код:

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)
...