WebGL 加速#

Bokeh 提供了有限的 WebGL 支持,用于在 Web 浏览器中渲染绘图。在可视化大型数据集时,使用 Bokeh 中的 WebGL 可能会有用,例如。

WebGL 是一个 JavaScript API,允许使用图形处理单元 (GPU) 的硬件加速在浏览器中渲染内容。WebGL 是一种标准,可在所有现代浏览器中使用。

如果您使用 Bokeh 的 WebGL 输出后端,Bokeh 会自动检测浏览器是否支持 WebGL。当您在 Bokeh 绘图中使用支持 WebGL 的元素,但浏览器不支持 WebGL 时,Bokeh 会自动使用默认的画布渲染器。

启用 WebGL#

要在 Bokeh 中启用 WebGL,请将绘图的 output_backend 属性设置为 "webgl"

p = figure(output_backend="webgl")

WebGL 输出后端仅支持 Bokeh 符号的一个子集。当您启用 WebGL 时,您是在请求使用 WebGL 渲染(如果可用)。在 WebGL 输出后端中不可用的符号将使用默认的画布后端渲染。

如果您启用了 Bokeh 的 WebGL 输出后端,则 WebGL 将在浏览器支持时使用。这包括在 Jupyter 笔记本或 Jupyter lab 中输出,以及在 将 Bokeh 绘图导出为 PNG 时(如果底层浏览器(包括无头浏览器)支持 WebGL)。

支持的符号#

散点图和其他固定形状符号#

Bokeh 的 WebGL 支持涵盖以下固定形状符号

对这些固定形状符号的 WebGL 支持涵盖以下属性

线条符号#

line()multi_line()step() 符号有完全的 WebGL 支持,尽管带有圆形和方形端盖的虚线的显示可能与默认的 HTML 画布渲染略有不同。

图像符号#

Bokeh 还支持 WebGL image()image_rgba()image_stack() 符号,但不支持 image_url()

何时使用 WebGL#

一般经验法则是,如果您要渲染少于 10,000 个标记或点,则 Bokeh 的默认画布输出后端效果很好。对于具有超过 25,000 个标记或点的绘图,WebGL 通常会提供明显更好的性能。一般而言,要渲染的标记或点越多,与默认画布输出后端相比,WebGL 就越高效。WebGL 性能超过画布的标记或点数取决于可用的硬件,因此您需要在自己的硬件上试用它,以了解最适合您的方法。

WebGL 示例#

以下示例是一个启用了 WebGL 的具有 10,000 个散点圆的绘图。请注意,即使没有对数据进行降采样,绘图也可以平滑地平移和缩放。

import numpy as np

from bokeh.plotting import figure, show

N = 10000

x = np.random.normal(0, np.pi, N)
y = np.sin(x) + np.random.normal(0, 0.2, N)

TOOLS = "pan,wheel_zoom,box_zoom,reset,save,box_select"

p = figure(tools=TOOLS, output_backend="webgl")
p.scatter(x, y, alpha=0.1, nonselection_alpha=0.001)

show(p)

同样,下面的绘图演示了用 10,000 个点绘制一条线。

import numpy as np

from bokeh.plotting import figure, show

N = 10000
x = np.linspace(0, 10*np.pi, N)
y = np.cos(x) + np.sin(2*x+1.25) + np.random.normal(0, 0.001, (N, ))

p = figure(title="A line consisting of 10k points", output_backend="webgl")

p.line(x, y, color="#22aa22", line_width=3)

show(p)