python - 这个 Bokeh 列数据源是如何工作的?

标签 python bokeh

我试图更好地了解 Bokeh(适用于 Python)中的列数据源。我找到了 this code ,但我似乎找不到解释我正在寻找的一些东西的文档,例如:

  1. lasso_select 工具的回调在哪里?我想看看在哪里描述了预期的功能。
  2. 如何在代码中描述 lasso_select 的功能? (如果我想改变它怎么办?)
  3. 列数据源发生了什么,以至于套索选择区域外的圆圈改变了外观? (我想知道如何使用列数据源进行比本演示中显示的更复杂的可视化。所以我想知道正在操作的字典字段是什么,以及它是如何被操作的。例如,是否有一个隐藏的“颜色”字段或类似的东西,在这段代码中没有明确显示?)
  4. 在执行 lasso_select 操作时,什么代码会导致重新绘制图形?

我还有很多与此和 CDSView 相关的问题,但我现在就到此为止。

from bokeh.io import output_file, show
from bokeh.layouts import gridplot
from bokeh.models import ColumnDataSource
from bokeh.plotting import figure

output_file("brushing.html")

x = list(range(-20, 21))
y0 = [abs(xx) for xx in x]
y1 = [xx**2 for xx in x]

# create a column data source for the plots to share
source = ColumnDataSource(data=dict(x=x, y0=y0, y1=y1))

TOOLS = "box_select,lasso_select,help"

# create a new plot and add a renderer
left = figure(tools=TOOLS, plot_width=300, plot_height=300, title=None)
left.circle('x', 'y0', source=source)

# create another new plot and add a renderer
right = figure(tools=TOOLS, plot_width=300, plot_height=300, title=None)
right.circle('x', 'y1', source=source)

p = gridplot([[left, right]])

show(p)

这与 my previous question 有关,在解释该特定问题时,唯一的答案非常狭窄。然而,我真的很感兴趣在引擎盖下发生了什么来给出所看到的结果。如果我能知道其中的一些细节,将有助于我更好地理解。

最佳答案

1) 没有回调。该工具负责定义选择几何体,然后基于该几何体进行 HitTest 。 HitTest 结果存储在数据源的 selection 属性中。字形渲染器根据其数据源的 selection 属性绘制字形。如果两个字形渲染器(即使在不同的绘图上)共享相同的数据源,那么它们都会绘制相同的选定/未选定集作为结果。

2) 如果您指的是正常对象、选定对象和未选定对象的外观,请在此处的文档中描述如何配置:

https://docs.bokeh.org/en/latest/docs/user_guide/styling.html#selected-and-unselected-glyphs

LassoTool 对象本身也有一些属性,例如是应该在每次鼠标移动时进行选择,还是只在鼠标弹起时进行选择,以及选择叠加层的外观。所有这些都记录在 ReferenceGuide 中。如果你问如何更改实现,就像 msot Bokeh 中的所有内容一样,真正的工作不是在 Python 中完成的,而是在 JavaScript 库 BokehJS 中完成的。 LassoTool 的实现在这里:

https://github.com/bokeh/bokeh/blob/master/bokehjs/src/lib/models/tools/gestures/lasso_select_tool.ts

如果您想要一些根本不同的东西,您需要实现您自己的自定义模型,包括它的 JavaScript 组件。有一个关于构建自定义扩展的完整用户指南部分:

https://docs.bokeh.org/en/latest/docs/user_guide/extensions.html

3) Plot 配置了各种 Renderer,其中之一可以是 GlyphRenderer。 GlyphRenderer 本身不绘制任何东西,但它配置了各种用于在特定情况下绘制的子字形:

  • glyph 绘制“正常”版本的字形(即当数据源上没有选择时)
  • selected_glyph 绘制“选定”版本的字形(即选择处于事件状态时套索或框工具内的字形)
  • nonselected_glyph draws the "non-selected"versions of glyphs (i.e. the ones outside a lasso or box tool when a selection is active) By default the non selection glyph is just a copy of the "alpha 值设置得很低的正常”字形。
  • hover_glyph 绘制字形的“悬停”版本(即当悬停工具检查它们时)

您可以通过配置每种情况下使用的字形的属性来配置不同情况下的外观。它们有合理的默认值,但可以按照 2) 的第一个链接中的描述更新它们

4) BokehJS 有一个内部信号/槽事件系统,用于(除其他外)在各种属性发生变化时请求 Canvas 重绘。

关于python - 这个 Bokeh 列数据源是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53607703/

相关文章:

python - 如何在 Django 模板中查看一个字符串是否包含另一个字符串

python - 在 Python 中多处理循环

python - X11 Tkinter + PIL + py2app = IOError 无法识别图像文件

python - 如何控制 Holoviews Holomap 图的图例位置?

python - 用于改变 Bokeh 图像图中使用的切片的交互式 slider

python - 关于python中的global关键字

用于在 Bokeh 中获取选定字形索引的 JavaScript 回调

python - 如何破解这个 Bokeh HexTile 图来修复坐标、标签位置和轴?

python - 使用 Bokeh push_notebook() 流式传输数据时内存溢出

python - Pandas 在匹配列中以不同的间隔加入数据帧