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

2024-06-25 23:56:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用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))

enter image description here

我正在玩一个附加的包装函数,但没有成功。当然,在现实中,我希望有更多的场景和更多的参数


Tags: import绘图示例列表参数选项line场景
2条回答

好吧,我想我找到了一个很好的解决办法:

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"])

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

作为另一个答案,您还可以link不同的小部件。在本例中,我们将用Dropdown菜单链接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);

相关问题 更多 >