使大型数据集的 Plotly 散点图更快 - Python

dod*_*hos 9 python plotly

我有一个大约 300,000 行的数据集。这是数据集的片段。

    id                datetime            results
0   30  2020-09-29 14:55:21+00             0.0424
1   30  2020-09-29 14:55:23+00             0.0424
2   31  2020-09-29 14:55:24+00             0.0424
3   31  2020-09-29 14:55:25+00             0.0424
4   32  2020-09-29 14:55:26+00             0.0424
5   32  2020-09-29 14:55:27+00             0.0424
Run Code Online (Sandbox Code Playgroud)

我尝试使用 matplotlib 绘制散点图,但速度非常慢。然后我转向 Plotly,因为我看到 scattergl 快速创建交互式图表,这正是我所需要的。然而,当我开始绘制 100,000 以上的任何内容时,图表非常慢并且需要大量时间来渲染。

这是我实现的代码:

import plotly.graph_objects as go

# readings is a pandas dataframe containing the data

def plot_scatter(df, x_column, y_column):
    fig = go.Figure(data=go.Scattergl(x=df[x_column], y=df[y_column], mode='markers')))

fig.show()

plot_scatter(readings, 'datetime', 'results')
Run Code Online (Sandbox Code Playgroud)

我还尝试按 id 分割绘制的点(因为每组具有特定 id 的点都有自己的颜色,并且 id 显示在图例中),但我尝试了几种方法,但运气不佳。

我真的很感激一些关于如何制作快速散点图(也许有比 scattergl 更好的东西)以及如何按 id 分割图表上的数据的帮助。

Jon*_*rdo 19

您的问题源于大多数可视化库中出现的设计选择。也就是说,Plotly 的 Python 绑定将所有数据发送到前端,导致渲染和交互速度都很慢。Plotly-Resampler通过执行动态聚合(即仅显示图形中有限数量的点)并在用户图形交互后渲染新点来解决此问题。有关用法示例,请参阅下面的 gif:

在此输入图像描述


将其映射到您的代码问题:

import pandas as pd; import numpy as np
import plotly.graph_objs as go
from plotly_resampler import FigureResampler

n = 300_000  # nbr of datapoints to plot

df = pd.DataFrame(
    data=np.sin(np.arange(n) / 50),
    index=pd.date_range(
       '2022/04/04 10:41', freq='s', periods=n
    ).rename('timestamp'),
    columns=['result']
).reset_index()
df
Run Code Online (Sandbox Code Playgroud)
    timestamp   result
0   2022-04-04 10:41:00     0.000000
1   2022-04-04 10:41:01     0.019999
2   2022-04-04 10:41:02     0.039989
3   2022-04-04 10:41:03     0.059964
4   2022-04-04 10:41:04     0.079915
...     ...     ...
Run Code Online (Sandbox Code Playgroud)

可视化代码:

# 1. Wrap the Plotly-Figure with the FigureResampler
fig = FigureResampler(go.Figure())
for  c in set(df.columns).difference({'timestamp'}):
    fig.add_trace(
        go.Scattergl(name=c, mode='lines+markers', showlegend=True),
        # OPTIONAL: for faster graph construction 
        #    -> add the trace data by using hf_x and hf_y
        hf_x=df['timestamp'], 
        hf_y=df[c]
    )

# 2. Instead of fig.show() call fig.show_dash()
fig.show_dash(mode='inline')
Run Code Online (Sandbox Code Playgroud)

希望这对您有进一步的帮助!
(免责声明 - 我是 Plotly-Resampler 的主要开发人员)

  • 这种努力是美妙的。它应该传播给更多有阴谋的用户。+1并且作为传播它的一种方式,为什么不创建一个问题作为问题并通过自我回答来推广这个模块? (2认同)