Как включить автоматическую повторную выборку при увеличении масштабирования данных с помощью holoviews вместе с потоком данных (в реальном времени) через канал в DynamicMap? - PullRequest
0 голосов
/ 27 мая 2019

Пока у меня есть поток данных через канал вместе с holoviews.DynamicMap, содержащим кривую, к которой применяется holoviews.operation.datashader.datashade (): при использовании инструмента масштабирования представление не пересчитывается (как для статическогоданные), что приводит к очень точечной визуализации моих данных.Что мне нужно сделать, чтобы включить эту повторную выборку?

Я запускаю все это в блокноте jupyter с python3

Когда я настраиваю свой holoviews.DynamicMap только со статическими данными, и у меня нет запущенного канала, он работает должным образом.

Когда я начинаю заполнять трубу (даже не используя ее), повторная выборка больше не происходит.(Я вообще не использую трубу)

Сценарий проблемы:

(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 голосов
/ 27 мая 2019

Проблема, с которой вы столкнулись, заключается в том, что если вы запустите обновления из цикла while, ядро ​​будет постоянно занято, что означает, что оно никогда не освободится, чтобы ответить на события, поступающие из JS, которые сообщают ему о необходимости повторной выборки. Вам нужно планировать события на канале асинхронно в некоторой форме. В записной книжке вы можете сделать это с помощью торнадо PeriodicCallback, например ::10000

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()
...