用于改进多行交互式 Altair 折线图的选项

时间:2021-05-01 03:13:30

标签: python pandas altair

我的要求是将形状为 (50,000, 2) 的 Pandas 数据框绘制为交互式折线图。一列包含 datetime64[ns],另一列包含浮点整数。

不幸的是,似乎有了这么多数据,交互式图表在平移和缩放时变得很慢。我的图表非常基本,我可以观察到,一旦我将行数减少到 < ~10,000,性能就会明显好转。我已阅读 FAQ 并了解官方指南甚至不建议开始时超过 5,000 行。尽管如此,我正在寻找提高性能的方法,但似乎对此没有太多讨论

我不需要一次显示所有 50,000 个数据点,但我确实希望将所有 50,000 个数据点存储在一个独立的 .html 文件(即图表)中。

我正在考虑“将绘图保存到磁盘”、“使用滑块创建滑动窗口效果以限制一次显示的数据点数量”、“使用更高效的数据类型”、“更改线条的外观,以减少渲染的强度”。真的,任何可能有帮助的东西都很好。对于某些情况,我将性能与更专用的可视化软件(如 Matlab)进行比较,在其中我可以毫无问题地制作交互式包含这么多数据的折线图。

或者,我也很高兴听到解释,为什么由于 HTML、JSON、Altair、Vega 或其他任何内容的限制,无法以交互方式绘制这么多数据。

1 个答案:

答案 0 :(得分:1)

正在努力使 Vega 的性能更高(包括通过 WebGL),您可以在此处阅读https://github.com/vega/vega/issues/2619。在这些土地之前,我认为你最好的办法是放大一个较小的区域,这听起来可能很好用,因为你提到不需要一次显示所有点。我发现使用 data_server 后端也可以帮助解决一些大数据速度减慢的问题,尽管与渲染无关。

import pandas as pd
import numpy as np
import altair as alt


alt.data_transformers.enable('data_server')

N=50000
test_df = pd.DataFrame({'t' : range(0, N, 1),
                        'A' : np.random.randint(0, 100, size=N)})

alt.Chart(test_df).mark_point().encode(
    alt.X('t', scale=alt.Scale(domain=[4000, 6000])),
    alt.Y('A', scale=alt.Scale(domain=[40, 60]))).interactive()