WebGL加速#

Bokeh 提供了对 WebGL 的有限支持,以便在网页浏览器中渲染图表。例如,在可视化较大数据集时,使用 WebGL 在 Bokeh 中可能非常有用。

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

如果您使用Bokeh的WebGL输出后端,Bokeh将自动检测浏览器是否支持WebGL。当您在Bokeh图表中使用启用了WebGL的元素但浏览器不支持WebGL时,Bokeh将自动使用默认的canvas渲染器代替。

启用WebGL#

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

p = figure(output_backend="webgl")

WebGL输出后端仅支持Bokeh的符号子集。当您启用WebGL时,您是在请求如果可用则使用WebGL渲染。WebGL输出后端中不可用的符号将使用默认的canvas后端进行渲染。

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

支持的符号#

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

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

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

线条符号#

对于line()multi_line()step()字形,有完整的WebGL支持,尽管带有圆形和方形端帽的虚线外观可能与默认的HTML画布渲染略有不同。

图像字形#

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

何时使用WebGL#

一般来说,Bokeh的默认画布输出后端在渲染少于10,000个标记或点时效果良好。对于超过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)