我正在想象一个400K到250万之间的散点图.我预计在可视化之前需要下采样,但为了看看我在Plotly Express中使用400K数据集进行了多少试点测试,曲线图迅速、漂亮且react 灵敏地弹出.

为了制作交互图形,我真的需要使用plotly.graph_Objects,因为我需要使用不同 colored颜色 比例的多个轨迹,所以我使用graph_Objects制作了基本上相同的图形,它不仅速度更慢,还导致我的计算机崩溃.

我真的想尽可能少地缩减样本,我对这两种方法之间的巨大性能差异感到惊讶,所以我想这可以归结为我的问题:

Why is there such a performance difference and is it possible to change layout/figure/whatever parameters in graph_objects so to close the gap?

下面这段代码显示了我所说的基本相同的图表的含义:

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崩溃,所以有很大的差异.

推荐答案

运行以下简单示例:

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)

正如您所看到的,当点数超过某个阈值时,Ploly Express似乎会切换到Scattergl.Scattergl在HTML5画布上渲染,因此它使用GPU(因此效率很高).而Scatter创建插入到当前文档中的SVG对象,消耗的内存要多得多.

Python相关问答推荐

如何使用OpenGL使球体遵循Python中的八样路径?

循环浏览每个客户记录,以获取他们来自的第一个/最后一个渠道

polars:有效的方法来应用函数过滤列的字符串

语法错误:文档. evaluate:表达式不是合法表达式

GPT python SDK引入了大量开销/错误超时

如何在Python中画一个只能在对角线内裁剪的圆?

Pandas:根据相邻行之间的差异过滤数据帧

日志(log)轴上的自定义刻度出现意外的次要刻度标记行为

使用Python下载pdf url

检测并显示网页更改

是什么导致了这个Gekko语法错误:函数字符串的语法错误:缺少左括号?

导入pythoncom如何找到正确的文件?

在重复时更新给定条件下的数据框行

TypeError:Py集群库中未调整大小的对象的Len()

Cdlib和iggraph的信息变化结果不同

我很难用Python Pandas打开旧格式的XLS文件

一种处理Django查询集数据的轻量级方法

用TensorFlow神经网络绘制趋势线

查找polars框架列和字符串变量之间的相似性时出错

Lxml xPASS在XML中的第一个标记下面找不到标记