我在散景中有一个散点图,我希望用户能够使用滑块以交互方式更改该图的所有圆的半径。
直到现在,我只设法做到这一点:
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)
但是当我改变滑块时,圆半径不会改变。
答案 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
方法。