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,所以有很大的差异。
运行以下简单示例:
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 对象,会消耗更多内存。