Ipywidgets:根据场景更改滑块默认值

Ipywidgets: alter slider defaults based on a scenario

我正在使用 ipywidges 创建绘图。我想要一个带有选项的下拉列表(例如场景 A、场景 B)。每个场景都应该改变滑块位置(a=0,b=1),之后应该可以自由修改参数。有什么想法吗?

这是我的玩具示例:

import ipywidgets as widgets

def line(a=0,b=1):
    #fig, ax = plt.subplots(figsize=(6, 4))
    x = np.arange(-10,10)
    y = a+xrange*b
    plt.xlim((-10,10))
    plt.ylim((-10,10))
    plt.plot(x, y)
    
widgets.interact(line, a=(-10,10,0.1), b=(-10,10,0.1))

我正在尝试使用额外的包装函数但没有成功。当然,在现实中,我希望有更多的场景和更多的参数。

好的,我想我找到了一个非常好的解决方法:

def line(a=0,b=0):
    x = np.arange(-10,10)
    y = a+x*b
    plt.xlim((-10,10))
    plt.ylim((-10,10))
    plt.plot(x, y)

sliders = widgets.interact(a=(-10,10,0.1), b=(-10,10,0.1))

def test(chose_defaults):
    if chose_defaults=="a":
        @sliders
        def h(a=5,b=5):
            return(line(a,b))
    if chose_defaults=="b":
        @sliders
        def h(a=0,b=1):
            return(line(a,b))
widgets.interact(test, chose_defaults=["a","b"])

以上代码基本上嵌套了两个widgets。首先显示一个单独的用于选择场景的小部件;场景的操作是仅在默认设置中不同的图。

正如另一个答案,您还可以 link 不同的小部件。在这种情况下,我们将使用 Dropdown 菜单 link ab 滑块,以便后者的更改将调用函数 on_change_*并切换滑块的默认值(取决于所选场景)。

import ipywidgets as widgets
import numpy as np
import matplotlib.pyplot as plt

def line(a=0,b=0):
    x = np.arange(-10,10)
    y = a+x*b
    plt.xlim((-10,10))
    plt.ylim((-10,10))
    plt.plot(x, y)

    
a_slider = widgets.FloatSlider(min=-10, max=10, step=0.1, value=0)
b_slider = widgets.FloatSlider(min=-10, max=10, step=0.1, value=1)
drop = widgets.Dropdown(options=["a", "b"], value="a", description='Scenario:')


def on_choose_a(d):
    if drop.value == "a":
        a_slider.value = 2
    else:
        a_slider.value = 5
    return a_slider.value


def on_choose_b(d):
    if drop.value == "a":
        b_slider.value = 3
    else:
        b_slider.value = 7
    return b_slider.value

widgets.dlink((drop, "value"), (a_slider, "value"), on_choose_a)
widgets.dlink((drop, "value"), (b_slider, "value"), on_choose_b)

display(drop)
widgets.interact(line, a=a_slider, b=b_slider);