如何将Bokeh Tap事件中的坐标附加到python对象?

时间:2019-09-04 21:27:49

标签: python bokeh

在下面的示例中,我试图获取当将散景图点按以附加到其各自列表中的数据字典coordList时,在图旁边的Div中显示的x和y坐标。

import numpy as np
from bokeh.io import show, output_notebook
from bokeh.plotting import figure
from bokeh.models import CustomJS, Div
from bokeh.layouts import column, row
from bokeh.events import Tap

coordList = dict(x=[], y=[])

output_notebook()

def display_event(div, attributes=[], style = 'float:left;clear:left;font_size=10pt'):
    "Build a suitable CustomJS to display the current event in the div model."
    return CustomJS(args=dict(div=div), code="""
        var attrs = %s; var args = [];
        for (var i = 0; i<attrs.length; i++) {
            args.push(Number(cb_obj[attrs[i]]).toFixed(2));
        }
        var line = "<span style=%r>(" + args.join(", ") + ")</span>\\n";
        var text = div.text.concat(line);
        var lines = text.split("\\n")
        if (lines.length > 35)
            lines.shift();
        div.text = lines.join("\\n");
    """ % (attributes, style))

x = np.random.random(size=4000) * 100
y = np.random.random(size=4000) * 100
radii = np.random.random(size=4000) * 1.5
colors = ["#%02x%02x%02x" % (int(r), int(g), 150) for r, g in zip(50+2*x, 30+2*y)]

p = figure(tools="pan,wheel_zoom,zoom_in,zoom_out,reset")
p.scatter(x, y, radius=np.random.random(size=4000) * 1.5,
          fill_color=colors, fill_alpha=0.6, line_color=None)

div = Div(width=400, height=p.plot_height)
layout = row(p, div)

point_attributes = ['x', 'y']

p.js_on_event(Tap, display_event(div, attributes=point_attributes))

show(layout)

我不确定如何保存坐标以及如何访问坐标并将其附加到列表中。

1 个答案:

答案 0 :(得分:0)

无法使用上述代码将坐标附加到python对象,因为该代码正在生成独立的输出(即它正在使用“ show”)。独立输出是发送到浏览器的纯静态HTML和Bokeh JSON,无需与任何Python进程建立任何连接。如果要将Bokeh可视化连接到实际运行的Python进程,请that is what the Bokeh server is for

如果运行Bokeh服务器应用程序,则可以将on_event与真实的python回调一起使用,以使用Tap even值运行所需的任何python代码:

def callback(event):
    # use event['x'], event['y'], event['sx'], event['sy']

p.on_event(Tap, callback)