首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >其总和不能超过指定值的滑块

其总和不能超过指定值的滑块
EN

Stack Overflow用户
提问于 2022-08-30 11:18:38
回答 1查看 42关注 0票数 0

使用bokeh,我尝试使用滑块与由12个元素组成的数组进行交互。在下面的代码中,每个滑块的值必须与数组中的相应值相乘(即slider1.value与数组相乘,slder2.value与array1等相乘)。它变得复杂的地方是,所有滑块的值的总和永远不能超过1.0。如果您想要增加1滑块的值,但所有12个滑块的总和为1.0,则必须先降低一个或多个滑块的值,然后才能这样做。如果所有滑块的值之和为0.67,那么在达到“极限”之前,您可以在其他滑块之间分配0.33,并且不能进一步增加它们。

下面是我的代码示例:

代码语言:javascript
运行
复制
from bokeh.io import show
from bokeh.models import ColumnDataSource, TextInput
from bokeh.palettes import Paired12, Pastel1_3, Bokeh8
from bokeh.plotting import figure
from bokeh.transform import factor_cmap

from bokeh.layouts import column, row
from bokeh.models import CustomJS, Slider, Dropdown, Panel, Tabs, HoverTool, Paragraph

array = [0, 0.25, 0.425, 0.0261420833, 0.035854375, 0.079944375, 0.0368772727, 0.0426204545, 0.228336818,
          0.0216474074, 0.0172977778, 0.0586568889]

callback_array = [0, 0.25, 0.425, 0.0261420833, 0.035854375, 0.079944375, 0.0368772727, 0.0426204545, 0.228336818,
         0.0216474074, 0.0172977778, 0.0586568889]

# Just an example of what the different slider values can be: The elements sum to 1.0.
# slider_values = np.array([0.10, 0.05, 0.03, 0.02, 0.08, 0.12, 0.08, 0.20, 0.12, 0.11, 0.09])

source = ColumnDataSource(data=dict(array=array, callback_array=callback_array))

slider1 = Slider(start=0, end=2, value=1, step=.05, title="Slider 1")
slider2 = Slider(start=0, end=2, value=1, step=.05, title="Slider 2")
slider3 = Slider(start=0, end=2, value=1, step=.05, title="Slider 3")
slider4 = Slider(start=0, end=2, value=1, step=.05, title="Slider 4")
slider5 = Slider(start=0, end=2, value=1, step=.05, title="Slider 5")
slider6 = Slider(start=0, end=2, value=1, step=.05, title="Slider 6")
slider7 = Slider(start=0, end=2, value=1, step=.05, title="Slider 7")
slider8 = Slider(start=0, end=2, value=1, step=.05, title="Slider 8")
slider9 = Slider(start=0, end=2, value=1, step=.05, title="Slider 9")
slider10 = Slider(start=0, end=2, value=1, step=.05, title="Slider 10")
slider11 = Slider(start=0, end=2, value=1, step=.05, title="Slider 11")
slider12 = Slider(start=0, end=2, value=1, step=.05, title="Slider 12")

callback = CustomJS(
    args=dict(source=source, slider1=slider1, slider2=slider2, slider3=slider3, slider4=slider4, slider5=slider5, slider6=slider6, slider7=slider7, slider8=slider8, slider9=slider9, slider10=slider10, slider11=slider11, slider12=slider12),
    code="""
    let x = source.data['empty']
    let y = source.data['counts'];
    for (let i = 0; i < y.length; i++) {
        x[0] = y[0] * slider1.value
        x[1] = y[1] * slider2.value
        x[2] = y[2] * slider3.value
        x[3] = y[3] * slider4.value
        x[4] = y[4] * slider5.value
        x[5] = y[5] * slider6.value
        x[6] = y[6] * slider7.value
        x[7] = y[7] * slider8.value
        x[8] = y[8] * slider9.value
        x[9] = y[9] * slider10.value
        x[10] = y[10] * slider11.value
        x[11] = y[11] * slider12.value       
        }

    source.change.emit();
""")

slider1.js_on_change('value', callback)
slider2.js_on_change('value', callback)
slider3.js_on_change('value', callback)
slider4.js_on_change('value', callback)
slider5.js_on_change('value', callback)
slider6.js_on_change('value', callback)
slider7.js_on_change('value', callback)
slider8.js_on_change('value', callback)
slider9.js_on_change('value', callback)
slider10.js_on_change('value', callback)
slider11.js_on_change('value', callback)
slider12.js_on_change('value', callback)

layout = row(column(slider1, slider2, slider3, slider4, slider5, slider6, slider7, slider8, slider9, slider10, slider11, slider12))

show(layout)
EN

回答 1

Stack Overflow用户

发布于 2022-08-31 06:48:17

您可以汇总滑块的值,并且只有在和大于1时才能进行更改。

在下面的示例中,只有3个滑块,如果所有三个滑块的值都大于1,则不会更新该数字。如果没有更新该数字,则会将该信息打印到浏览器控制台。

不可能消除滑块。也不可能只让成长中的部分失去活力。

代码语言:javascript
运行
复制
from bokeh.plotting import show, output_notebook, figure
from bokeh.layouts import column
from bokeh.models import CustomJS, Slider, ColumnDataSource
output_notebook()

array = [0, 0.25, 0.425]
callback_array = [0, 0.25, 0.425]

source = ColumnDataSource(data=dict(
    array=array,
    callback_array=callback_array,
    index=list(range(len(array)))
))

sliders = []
for i in range(len(array)):
    sliders.append(Slider(start=0, end=2, value=0.1, step=.05, title=f"Slider {i}"))

callback = CustomJS(
    args=dict(source=source, sliders=sliders),
    code="""
    let x = source.data['array']
    let y = source.data['callback_array'];

    console.log(sliders)
    let slider_sum = 0
    for (let i = 0; i < sliders.length; i++) {
        slider_sum += sliders[i].value
    }

    if (slider_sum < 1){
        for (let i = 0; i < sliders.length; i++) {
            x[i] = y[i] * sliders[i].value
        }
    }
    else{
        console.log("The maximum of all sliders extends 1. Please reduce a slider first.")
    }
    source.change.emit();
""")


for slider in sliders:
    slider.js_on_change('value', callback)

p = figure(width=300, height=300)
p.line(x='index', y='array', source=source)
layout = column(*sliders, p)

show(layout)

我真的希望这能帮到你。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73541593

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档