我有一个大约 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 的主要开发人员)