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 a
和 b
滑块,以便后者的更改将调用函数 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);
我正在使用 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 a
和 b
滑块,以便后者的更改将调用函数 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);