使用bokeh,我尝试使用滑块与由12个元素组成的数组进行交互。在下面的代码中,每个滑块的值必须与数组中的相应值相乘(即slider1.value与数组相乘,slder2.value与array1等相乘)。它变得复杂的地方是,所有滑块的值的总和永远不能超过1.0。如果您想要增加1滑块的值,但所有12个滑块的总和为1.0,则必须先降低一个或多个滑块的值,然后才能这样做。如果所有滑块的值之和为0.67,那么在达到“极限”之前,您可以在其他滑块之间分配0.33,并且不能进一步增加它们。
下面是我的代码示例:
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)发布于 2022-08-31 06:48:17
您可以汇总滑块的值,并且只有在和大于1时才能进行更改。
在下面的示例中,只有3个滑块,如果所有三个滑块的值都大于1,则不会更新该数字。如果没有更新该数字,则会将该信息打印到浏览器控制台。
不可能消除滑块。也不可能只让成长中的部分失去活力。
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)


我真的希望这能帮到你。
https://stackoverflow.com/questions/73541593
复制相似问题