【问题标题】:How to make a Bokeh scatter plot interactive (with slider)如何使散景散点图具有交互性(带滑块)
【发布时间】:2018-09-24 23:41:11
【问题描述】:

我正在尝试根据here 发布的简单示例代码在 Bokeh 中制作散点图。

以下代码为折线图生成了一个工作演示:

from bokeh.layouts import column
from bokeh.models import CustomJS, ColumnDataSource, Slider
from bokeh.plotting import Figure, show

# fetch and clear the document
from bokeh.io import curdoc
curdoc().clear()

x = [x*0.005 for x in range(0, 100)]
y = x

source = ColumnDataSource(data=dict(x=x, y=y))

plot = Figure(plot_width=400, plot_height=400)

plot.line(x='x', y='y', source=source)

def callback(source=source, window=None):
    data = source.data
    f = cb_obj.value
    x, y = data['x'], data['y']
    for i in range(len(x)):
        y[i] = window.Math.pow(x[i], f)
    source.trigger('change')

slider = Slider(start=0.1, end=4, value=1, step=.1, title="Start week",
                callback=CustomJS.from_py_func(callback))

layout = column(slider, plot)

show(layout)

看起来像这样:

在此演示中,当您调整滑块并按下“重置”图标时,绘图会根据更新后的 y=f(x) 公式重新绘制。

但是,我想制作一个变化的散点图,而不是折线图。

问题:

当我将上述代码中的 plot.line 简单地更改为 plot.circle 时,绘图渲染正常,但它是静态的 - 当您移动滑块并按下“重置”时它不会改变。我看不到任何错误消息。

【问题讨论】:

    标签: python plot slider bokeh


    【解决方案1】:

    我找到了答案in the documentation

    callback 中的最后一行应该是 source.change.emit() 而不是 source.trigger('change')。我不知道这两者之间的区别,但后者适用于圆形图。

    def callback(source=source, window=None):
        data = source.data
        f = cb_obj.value
        x, y = data['x'], data['y']
        for i in range(len(x)):
            y[i] = window.Math.pow(x[i], f)
        source.change.emit()
    

    【讨论】:

    • source.trigger('change') 以前是正确的,在一些 0.x 版本中返回,但很长一段时间都不是正确的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-17
    • 1970-01-01
    • 1970-01-01
    • 2016-05-20
    • 1970-01-01
    • 2023-03-09
    相关资源
    最近更新 更多