【问题标题】:How to call a JS function or Python method when a glyph is completely rendered?字形完全渲染后如何调用 JS 函数或 Python 方法?
【发布时间】:2020-02-10 21:15:01
【问题描述】:

我将散景用作服务器应用程序。当我在绘图中进行选择时,我会在 python 中执行一些操作并更新一些源 (CDS)。这种变化反映在情节中。有没有办法检查字形何时完全呈现(更新后)?我想在全部加载完毕后调用 JavaScript 函数?使用该函数,我想调用其他 python 方法再次更新 CDS。

如果我不等待此配置文件被呈现,则应用程序可能会中断,而这正是我想要避免的。实际上我过去做了一些测试,我必须创建一个巨大的 CDS 而不是几个较小的 CDS 才能使其正常工作。

我的用例。我为什么要做这个?

我的布局中有很多选项卡,例如,它们可以是 10 个。每个选项卡都有一些图(3-6 个图)。如果我同时更新整个 ColumnDataSource,则需要一段时间。然后我想让它更流畅,所以我只想更新当前可见选项卡的数据,它会渲染得更快并且用户会立即收到响应。我可以暂时禁用其余选项卡以防止出现故障。此时我需要调用 JS 或 python 方法来更新其余选项卡的内容。

为了加快进程,我想实现以下目标:

关于数据

基本上我有两个 DataFrame,一个用于构建点云(大约 5000 行和 130 列),我从选定的点中提取另一个 DataFrame 以知道我应该绘制哪些线(360 列和 5 到 15 行),进行一些过滤和选择。我使用的算法在the answer 我之前写的一个问题中。有了这么多数据,算法需要 6 或 7 秒才能完成。

关于如何提高性能或如何拆分或计算的任何其他想法?

【问题讨论】:

    标签: javascript python python-3.x performance bokeh


    【解决方案1】:

    要提高渲染速度,您可以尝试webgl JavaScript API。这个 Bokeh 文档页面 Speeding up with WebGL 解释了如何做到这一点。 webgl 支持圆圈、线条和大多数标记。应用:

    p = Plot(output_backend="webgl")  # for the glyph API
    p = figure(output_backend="webgl")  # for the plotting API
    

    请注意,用户报告了 webgl 的问题,例如情节口吃等......但它可能适用于您的情况,具体取决于您的情节包含的字形类型。

    还要确保传递给绘图的数据不包括 NaN,因为众所周知这会降低 Bokeh 性能。

    据我所知,没有属性表明渲染已完成或仍在进行中,但您可能会考虑一些其他替代方案来加快速度,例如将 Bokeh 与 Datashader 结合使用(pre-将大型数据集渲染为固定大小的光栅图像)或Dask(加快从多个来源读取数据,如多个 csv 文件)

    例如,您可以有一个标准的散景图,您可以在其中制作一个 选择并让其他图生成为 Datashader 图像 并将它们嵌入到散景图中。

    This example 展示了如何结合 Bokeh + Datashader 显着提高性能,尤其是在过度绘图发生时。请注意,每次将一个点添加到绘图中时,整个画布区域都将在浏览器中重新绘制。这就是浏览器的工作方式。 Datashader 可以提供单个图像,因此更新绘图要快得多,同时您仍然可以使用缩放、平移等工具栏工具......

    Python 代码实现细节也很重要。使用例如gridplot 链接许多图可能会降低性能,因此最好将它们一一添加到文档根等...

    【讨论】:

    • 感谢您花时间撰写回复。我从一开始就启用了webgl,没关系。我不确定我是否可以使用 Datashader,因为我应该能够一直使用选择工具,而不仅仅是平移和缩放工具。我不知道 Dask DataFrame,我已经更新了我的答案,提供了更多细节,你认为这种 DataFrame 会加快算法的计算速度吗?
    • 根据文档 Dask 在以下情况下派上用场:1) 操作大型数据集,即使这些数据集不适合内存。 2) 使用多核加速长计算。 3) 使用标准 Pandas 操作(如 groupby、join 和时间序列计算)对大型数据集进行分布式计算。
    • 感谢您提供可能的解决方案,但没有一个对我有帮助。 webgl 已启用。我不能使用datashader,因为我需要与样本保持交互。我也尝试过使用 Dask Dataframe,但是算法需要更长的时间才能完成(我认为由于开销)。无论如何,我会赞成您的回答,因为它们可能对其他人有用!
    【解决方案2】:

    前段时间我做了一个技巧来检查我的设计是否可以在渲染图时触发某些功能:

    1. 首先我更新了当前选项卡。这运行得非常好而且速度很快。
    2. 然后我设置了一个超时来更新其余选项卡的数据。但是,在执行第二个算法的同时,我无法处理当前选项卡的绘图,因为它们被冻结了。

    因此,在渲染所有内容时触发函数的方法不是一个好主意,因为即使使用这样的回调,应用程序也不会像我预期的那样工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-20
      • 1970-01-01
      • 2011-07-28
      • 1970-01-01
      相关资源
      最近更新 更多