使用多个滑块在单个图形中操纵曲线

时间:2018-08-19 20:22:08

标签: pandas matplotlib slider jupyter-notebook ipywidgets

我创建了以下Jupyter Notebook。在此,使用三个滑块移动三个功能。将来,我想将其概括为任意数量的曲线(即n曲线)。但是,现在,图更新过程非常缓慢,并且图本身似乎并未固定在相应的单元格中。我没有收到任何错误消息,但是我很确定更新功能中有错误。 这是代码

from ipywidgets import interact
import ipywidgets as widgets
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from IPython.display import display


x = np.linspace(0, 2*np.pi, 2000)
y1=np.exp(0.3*x)*np.sin(5*x)
y2=5*np.exp(-x**2)*np.sin(20*x)
y3=np.sin(2*x)

m=[y1,y2,y3]

num_curve=3


def shift(v_X):
    v_T=v_X
    vector=np.transpose(m)
    print(' ')
    print(v_T)
    print(' ')
    curve=vector+v_T
    return curve

controls=[]
o='vertical'
for i in range(num_curve):
    title="x%i" % (i%num_curve+1)
    sl=widgets.FloatSlider(description=title,min=-2.0, max=2.0, step=0.1,orientation=o)
    controls.append(sl)
Dict = {} 
for c in controls:
    Dict[c.description] = c  
uif = widgets.HBox(tuple(controls))


def update_N(**xvalor):
    xvalor=[]
    for i in range(num_curve):
        xvalor.append(controls[i].value)
    curve=shift(xvalor)
    new_curve=pd.DataFrame(curve)
    new_curve.plot()
    plt.show()

outf = widgets.interactive_output(update_N,Dict)
display(uif, outf)

1 个答案:

答案 0 :(得分:0)

您的函数正在滑块移动的每个值上运行,这可能会使您看到的运行时间较长。您可以通过将continuous_update=False添加到您的FloatSlider调用中来更改此设置(第32行)。

sl=widgets.FloatSlider(description=title,
                       min=-2.0, 
                       max=2.0, 
                       step=0.1,
                       orientation=o, 
                       continuous_update=False)

这使我获得了更好的性能,并且图表没有闪烁,因为重绘的数量少得多。这有帮助吗?