为什么 Plotly Express 比 Plotly Graph Objects 更高效?

4

我正在可视化一个包含400K到2.5M个点的散点图。在绘制之前,我预计需要进行下采样,但为了查看情况,我使用plotly express对400k个数据集进行了试验,结果图表很快、漂亮且响应迅速。

为了创建交互式图表,我需要使用plotly.graph_objects,因为我需要使用不同颜色比例的多个轨迹。所以,我使用graph_objects画了基本相同的图表,但它不仅慢,而且还导致了电脑崩溃。

我希望尽可能少地进行下采样,并对这两种方法之间的性能差异感到惊讶,因此我想问:

为什么会有如此大的性能差异?是否可以更改graph_objects中的布局/图形/其他参数来缩小差距?

以下是一个代码片段,展示了我所说的基本相同的图表:

graph_objects

        fig = go.Figure()
        fig.add_trace(go.Scatter(x = x_values, y = y_values, opacity = opacity, marker = {
                'size': size,
                'color': community,
                'colorscale': colorscale
            }))

express

        pacmap_map = px.scatter(x = x_values, y = y_values, color_continuous_scale=colorscale,  opacity = opacity, color = community)
        pacmap_map.update_traces(marker = {
                'size': size
            })

我本来预计表现应该要么相同,要么至少在同一范围内,但是express运作得非常好,而graph_objects却导致jupyter内核崩溃以及IDE的崩溃,这造成了很大的差异。

1个回答

4

运行以下简单示例:

import numpy as np
import plotly.graph_objects as go
import plotly.express as px

x = np.linspace(-2, 2, 100000)
y = np.cos(x)

fig = go.Figure(data=[go.Scatter(x=x, y=y)])
fig2 = px.scatter(x=x, y=y)

type(fig.data[0]), type(fig2.data[0])
# out: (plotly.graph_objs._scatter.Scatter, plotly.graph_objs._scattergl.Scattergl)

正如你所看到的,当数据点数量超过某个阈值时,plotly express似乎会切换到Scattergl。 Scattergl 渲染在html5画布上,因此它使用GPU(因此更加高效)。而Scatter则创建svg对象并插入当前文档中,消耗的内存要多得多。


这就是我一直在寻找的关键区别。谢谢!看起来Scattergl默认使用的是一大堆线图而不是散点图,但这很容易解决。 - psychicesp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接