为什么plotlyexpress比plotlygraph_objects性能好得多?

psy*_*esp 4 python plotly plotly-express

我正在可视化包含 400K 到 250 万个点的散点图。我预计在可视化之前需要进行下采样,但为了看看我在plotlyexpress 中使用 400k 数据集进行了多少试点测试,并且绘图快速、美观且响应迅速地弹出。

为了制作交互式图形,我确实需要使用plotly.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
            }))
Run Code Online (Sandbox Code Playgroud)

表达

        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
            })

Run Code Online (Sandbox Code Playgroud)

我本来期望性能是相同的,或者至少在相同的范围内,但 Express 的工作就像一个梦想,而 graph_objects 会崩溃 jupyter 内核以及它运行的任何 IDE,所以有很大的差异。

Dav*_*_sd 5

运行以下简单示例:

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)
Run Code Online (Sandbox Code Playgroud)

Scattergl正如您所看到的,当点数高于某个阈值时,plotlyexpress 似乎会切换。Scattergl 在 html5 画布上渲染,因此它使用 GPU(因此效率)。而Scatter创建插入到当前文档中的 svg 对象,会消耗更多内存。