Boc*_*ape 5 python data-visualization large-data bokeh holoviews
我想要做的是为大型时间序列创建一个带有平移和放大/缩小交互的交互式绘图。
考虑 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)))
Run Code Online (Sandbox Code Playgroud)
使用n_samples=1_000进展顺利,但当前的样本数量约为 10-1 亿点,因此速度非常慢。
我认为这是因为它创建了所有图形元素并将它们存储在内存中。然后,当我使用平移工具更改 x 中的范围时,它必须搜索需要绘制所有元素中的哪些元素,这就是缓慢的部分。
如果是这种情况,解决方案可能是考虑画布的范围,仅从数组中绘制 1k-5k 点的子集。我不需要画布上的所有点,因此可以即时计算它们。
你知道解决这个问题的另一种方法吗?我是使用 Bokeh 和 Holoviews 的新手。
谢谢!
当然。正如 Sander 所建议的,您可以使用 Datashader 在浏览器之外渲染数据,以提高速度和效率。一旦定义了curves,只需执行以下操作:
import holoviews.operation.datashader as hd
hd.rasterize(curves) # as the last line in your Jupyter notebook cell
Run Code Online (Sandbox Code Playgroud)
你不应该需要消灭。
| 归档时间: |
|
| 查看次数: |
108 次 |
| 最近记录: |