在Bokeh中连接多个滑块-Python

时间:2019-11-25 01:20:38

标签: python python-3.x slider bokeh

希望有人可以解决我的问题-我的智慧到了尽头。

我想在散景圆图中链接三个滑块。总数应始终为1(例如,当使用一个滑块时,其他滑块必须减少,因此总和始终为1)

更新:滑块没有反应的条件。如果两者同时减少,那会很好,但我不在乎...

到目前为止,我已经能够实现所有滑块,但它们只是独立工作。我已经尝试使用JavaScript自定义回调,但这超出了我的理解。

如果有人能启发我,那将是非常棒的, 这是代码:

import statistics as stats
from bokeh.io import curdoc
from bokeh.layouts import column, row
from bokeh.models import ColumnDataSource, Slider,CustomJS, TextInput, Span,CategoricalColorMapper
from bokeh.models.tools import HoverTool
from bokeh.plotting import figure
from bokeh.palettes import Spectral6

Purchasing = [91.88405797, 85.9986413 , 84.25271739, 89.11684783, 75.50271739,
       87.31431159, 90.36458333, 94.08061594, 88.13405797, 82.7807971 ,
       86.7798913 , 88.17028986, 86.07789855, 91.88405797, 91.88405797,
       91.88405797, 96.5307971 , 96.15036232]
TechSupport = [ 98.83534137,  77.49665328,  80.20080321,  87.1686747 ,
        72.40963855,  69.79919679,  91.56626506,  87.34939759,
        91.66666667,  84.84366036,  88.95582329,  91.56626506,
        92.85140562,  88.95582329, 100.        , 100.        ,
        99.11646586, 100.        ]
Materials = [82.59355962, 72.82816715, 72.6904661 , 82.59355962, 81.17238618,
       76.65485515, 81.13385703, 86.30709871, 86.94516971, 86.56883131,
       82.59355962, 86.38817563, 86.94516971, 82.59355962, 82.59355962,
       86.94516971, 82.59355962, 82.59355962]

y = [0.625, 0.625, 0.375, 0.375, 0.375, 0.375, 0.625, 0.625, 0.5 ,
       0.625, 0.75 , 0.325, 0.575, 1.125, 0.375, 0.45 , 0.575, 0.325]

Names = ['Company 1', 'Company 2', 'Company 3', 'Company 4', 'Company 5',
       'Company 6', 'Company 7', 'Company 8', 'Company 9', 'Company 10',
       'Company 11', 'Company 12', 'Company 13', 'Company 14',
       'Company 15', 'Company 16', 'Company 17', 'Company 18']

Purchasing_Weight   = 0.368
TechSupport_Weight = 0.249
Materials_Weight = 0.383

#xmin, xmax = min(x), max(x)
#ymin, ymax = min(y), max(y)

source = ColumnDataSource(data=dict(x=Materials,z=TechSupport,w=Purchasing,y=y,Names=Names,Category=Category))

# Set up plot
plot = figure(
        title = "Performence to Risk Dispertion: Q1",
        x_axis_label = "Performance",y_axis_label = "Business Risk",
        #x_range=(xmin, xmax),y_range=(ymin, ymax),
        plot_width = 1000,
        plot_height = 500,
        tools ="pan,zoom_in,zoom_out,reset,save")



# Tools
hover = HoverTool()
#hover.tooltips= [ ("Company: ", "$Names"),("(x,y)", "($x, $y)")]
hover.tooltips = """
<div>
    <h3><font size="+1">@Names</font></h3>
    <h3><font size="+1">@Category</font></h3>
    <div><strong><font size="+0">Perf: </strong>@x</font><div>
    <div><strong><font size="+0">Risk: </strong>@y</font><div>
</div>
"""
plot.add_tools(hover)


# ascribe plot
plot.circle(x= "x", y= "y",
         size=10, line_width=2,
         source = source)


slider1 = Slider(start=0.0, end=1, value=Purchasing_Weight,step=0.01, title='Purchasing_Weight')
slider2 = Slider(start=0.0, end=1, value=TechSupport_Weight, step=0.01, title='TechSupport_Weight')
slider3 = Slider(start=0.0, end=1, value=Materials_Weight, step=0.01, title='Materials_Weight')
def callback(attr, old, new): 

    #while slider1.value + slider2.value + slider3.value > 1:
    #    slider2.value - 0.01

    Purchasing_Weight = slider1.value
    TechSupport_Weight = slider2.value
    Materials_Weight = slider3.value

 #  new_data = dict(x = np.multiply(Materials,Purchasing_Weight),z=TechSupport,w=Purchasing,y=y,Names=Names,Category=Category)    
    new_data = dict(x = np.multiply(Materials,Materials_Weight)+np.multiply(TechSupport,TechSupport_Weight)+np.multiply(Purchasing,Purchasing_Weight),
                    y=y,Names=Names,Category=Category)    
    source.data = new_data
    hover.tooltips = """
    <div>
        <h3><font size="+1">@Names</font></h3>
        <h3><font size="+1">@Category</font></h3>
        <div><strong><font size="+0">Perf: </strong>@x</font><div>
        <div><strong><font size="+0">Risk: </strong>@y</font><div>
    </div>
    """
    plot.add_tools(hover)


callback2 = CustomJS(args=dict(sider1=slider1, slider2=slider2), code="""
    slider2.end = slider1.value;
    source.change.emit();
""")

slider1.on_change('value', callback)
#slider1.js_on_change('value', callback2)

slider2.on_change('value', callback)
slider3.on_change('value', callback)

# Set up layouts and add to document
layout = column(slider1,slider2,slider3, plot)

curdoc().add_root(layout)
import os
os.system(r'cd /D C:\Users\PathofDocument') 
os.system("bokeh serve --show NameofScript.py")```

####Cheers and thanks in advance for any help!####  

0 个答案:

没有答案