如何启用通过holoviews以及通过管道进入DynamicMap的(实时)数据流对数据着色器中的缩放进行自动重采样?

时间:2019-05-26 23:09:25

标签: stream pipe bokeh holoviews datashader

虽然我有一条流经管道的数据流以及一个包含Curve的holoviews.DynamicMap,但在其上应用了holoviews.operation.datashader.datashade():使用缩放工具时,该视图不会重新采样(例如静态数据)导致我的数据非常像素化的可视化。我需要做什么才能启用此重采样?

我用python3在jupyter笔记本中运行整个过程

当我使用静态数据设置我的holoviews.DynamicMap时,没有管道在运行,它可以正常工作。

当我开始填充管道时(不再使用),不再进行重采样。 (我根本不使用管道)

问题场景:

(在jupyter笔记本中为3个单元格)

(1)导入

import time
import numpy as np
import holoviews as hv

from holoviews.operation.datashader import datashade

from holoviews import opts
from holoviews.streams import Pipe

hv.extension('bokeh')

(2)设置管道和绘图

#no of samples
N=100000

pipe2 = Pipe(data=[])
data_dmap = hv.DynamicMap(hv.Curve, streams=[pipe2])

data_dmap_opt = datashade(data_dmap, streams=[hv.streams.RangeXY])
data_dmap_opt.opts(width=900,xlim=(0, N),ylim=(0, 1))

(3)生成数据流

def makeBigData(N):
    x = np.arange(N)
    y = np.random.rand(N)

    while True:
        time.sleep(1)
        y = np.random.rand(N)
        pipe2.send((x,y))

调试方案:

替代单元格(2)

(替代方法2)使用静态绘图设置管道和绘图

#default Data
N=100000
x = np.arange(N)
y = np.random.rand(N)

pipe2 = Pipe(data=[])
data_dmap = hv.DynamicMap(hv.Curve((x,y)))


data_dmap_opt = datashade(data_dmap, streams=[hv.streams.RangeXY])
data_dmap_opt.opts(width=900,xlim=(0, 100000),ylim=(0, 1))

(只要不执行单元格(3),此方法就起作用,然后该替代方法停止工作)

预期结果:

不断用噪声更新绘图(在后期使用实际数据)

因此,将实际图形采样到图像中,放大采样时应将其调整为实际视图

实际结果:

放大不会触发对图像采样的调整。

1 个答案:

答案 0 :(得分:0)

您遇到的问题是,如果您从while循环触发更新,则内核将永远处于繁忙状态,这意味着它永远不会被释放以响应从JS到达的事件,从而告诉它重新采样。您需要以某种形式异步安排管道上的事件。在笔记本中,您可以使用龙卷风PeriodicCallback进行此操作,例如:

from tornado.ioloop import PeriodicCallback
from tornado import gen

N = 100
x = np.arange(N)    

@gen.coroutine
def f():
    y = np.random.rand(N)
    pipe.send((x, y))

cb = PeriodicCallback(f, 1000)
cb.start()