散点图:以交互方式更改圆半径

时间:2019-01-31 16:53:58

标签: javascript python bokeh

我在散景中有一个散点图,我希望用户能够使用滑块以交互方式更改该图的所有圆的半径。

直到现在,我只设法做到这一点:

from bokeh.plotting import figure, show
from bokeh.models import CustomJS, Slider
from bokeh.layouts import column
import pandas as pd

radius = 0.3
source = pd.DataFrame([[1, 2], [3, 5], [3, 4]], columns=['a','b']) 
p = figure()
p.scatter(x='a', y='b', source=source, radius=radius)

callback = CustomJS(args=dict(radius=radius), code="""
        var radius = cb_obj.get('value');
        source.trigger('change');
    """)

slider = Slider(start=0.1, end=1.0, value=0.3, step=.05, title="Circle-radius", callback=callback)
layout = column(p, slider)
show(layout)

但是当我改变滑块时,圆半径不会改变。

1 个答案:

答案 0 :(得分:1)

您正在将滑块的值读取到本地JavaScript变量中,但是实际上并没有将其用于任何东西。为了影响字形,您实际上需要设置字形的某些属性,或更新驱动字形的数据。为此,您可以在args字典中传递 Bokeh对象(通常不会像您那样传递普通的python值)。

此外,很久以前就删除了.get语法,除非您使用的是Bokeh的较旧版本,否则应使用cb_obj.value

这是一个经过Bokeh> 1.0测试的完整示例

from bokeh.plotting import figure, show
from bokeh.models import CustomJS, Slider
from bokeh.layouts import column
import pandas as pd

source = pd.DataFrame([[1, 2], [3, 5], [3, 4]], columns=['a','b'])
p = figure()
r = p.circle(x='a', y='b', source=source, radius=0.3)

callback = CustomJS(args=dict(renderer=r), code="""
    renderer.glyph.radius = cb_obj.value;
""")

slider = Slider(start=0.1, end=1.0, value=0.3, step=.05, title="Circle-radius")
slider.js_on_change('value', callback)

show(column(p, slider))

最后,尽管Bokeh 1.x仍支持callback属性,但很快就会弃用。新代码应使用上面显示的常规js_on_change方法。

enter image description here