使用Holoviews Bokeh在Python中绘制大型数据集的特定子集。

5

我想要做的是创建一个交互式图表,可进行平移和缩放操作,以展示大量时间序列数据。

在Jupyter Notebook中考虑以下情况:

import numpy as np

import holoviews as hv
import holoviews.plotting.bokeh
from holoviews.operation import decimate

hv.extension('bokeh')

n_samples = 1_000 #100_000_000

x = np.linspace(0.0,10.0, n_samples)

y = np.zeros((64, n_samples))
r = np.random.rand(n_samples)

for i in range(64):
    y[i] = np.sin(r + np.random.rand(n_samples)*0.3)+i


curves = hv.Curve( (zip(x,y[0,:])) ).opts(height=400, width=800)
for i in range(1,64):
    curves *= hv.Curve( (zip(x,y[i,:])) ) 

curves = curves.options({'Curve': {'color': 'black'}})

curves = decimate(curves).collate()

curves.redim(x=hv.Dimension('x', range=(0, 2)))

使用n_samples=1_000可以正常运行,但当前样本数量为约10-100百万个点,因此速度非常慢。

我认为这是因为它创建了所有图形元素并将它们存储在内存中。然后,当我使用Pan工具改变x的范围时,它必须搜索需要绘制的所有元素,这就是慢的部分。

如果是这种情况,解决方法可能是仅绘制1k-5k个点的子集,考虑画布的范围。我不需要画布上的所有点,因此可以即时计算它们。

你知道解决这个问题的另一种方法吗?我是Bokeh和Holoviews的新手。

谢谢!


1
针对大量数据点,同一开发人员创建了datashader包,该包与holoviews配合使用:https://datashader.org/ 或者查看建立在holoviews之上的hvplot,它还允许您在绘图中使用datashader,例如df.hvplot.scatter(x='distance', y='airtime', datashade=True) https://hvplot.holoviz.org/user_guide/Plotting.html - Sander van den Oord
1个回答

1
当然。如Sander所建议的那样,您可以使用Datashader在浏览器外部呈现数据以提高速度和效率。一旦您定义了curves,只需执行以下操作:
import holoviews.operation.datashader as hd

hd.rasterize(curves)  # as the last line in your Jupyter notebook cell

你不应该需要减少。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接