如何在带有全息视图的数据着色器中启用自动重采样以及通过管道进入 DynamicMap 的(实时)数据流?
How to enable automatic resampling on zoom in datashader with holoviews together with a (live) data stream through a pipe into a DynamicMap?
虽然我有一个数据流通过管道连同一个包含曲线的 holoviews.DynamicMap,在该曲线上应用了 holoviews.operation.datashader.datashade():当使用缩放工具时,视图不会重新采样(如对于静态数据)导致我的数据非常像素化可视化。我需要做什么才能启用此重采样?
我 运行 jupyter notebook 中的所有内容 python3
当我只使用静态数据设置 holoviews.DynamicMap 并且没有管道 运行ning 时,它可以正常工作。
当我开始填充管道(从未使用过它)时,不再进行重采样。 (我根本不使用管道)
问题场景:
(jupyter notebook 中有 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) 未被执行,此选项就会停止工作)
预期结果:
用噪声不断更新图(在后期用真实数据)
因此实际图形被采样成图像,放大时采样应调整为实际视图
真实结果:
放大不会触发对图像采样的调整。
您遇到的问题是,如果您从 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()
虽然我有一个数据流通过管道连同一个包含曲线的 holoviews.DynamicMap,在该曲线上应用了 holoviews.operation.datashader.datashade():当使用缩放工具时,视图不会重新采样(如对于静态数据)导致我的数据非常像素化可视化。我需要做什么才能启用此重采样?
我 运行 jupyter notebook 中的所有内容 python3
当我只使用静态数据设置 holoviews.DynamicMap 并且没有管道 运行ning 时,它可以正常工作。
当我开始填充管道(从未使用过它)时,不再进行重采样。 (我根本不使用管道)
问题场景:
(jupyter notebook 中有 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) 未被执行,此选项就会停止工作)
预期结果:
用噪声不断更新图(在后期用真实数据)
因此实际图形被采样成图像,放大时采样应调整为实际视图
真实结果:
放大不会触发对图像采样的调整。
您遇到的问题是,如果您从 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()