связанные потоки через динамические карты - PullRequest
0 голосов
/ 21 ноября 2018

У меня есть набор гиперспектральных данных, сетка X, Y, Энергия, где каждая точка представляет собой полный спектр.Из этих спектров я могу создавать стеки изображений, например, стек изображений 1 = сумма отсчетов от канала 600-650 по сетке, стек изображений 2 = 700-750 и т. Д.

Я хотел бы иметь возможность отображать изображениестеки и когда пользователь нажимает на пиксель или настраивает ползунок kdim, показывает полный спектр в этой точке X, Y, Energy.

В данный момент я могу показать один стек изображений и обновить спектр одним щелчком мыши или при изменении kdim, используя приведенный ниже пример кода подтверждения принципа.Это уже довольно хорошо, но если я увеличу количество изображений (переменная nimages в коде) и попытаюсь создать несколько потоков SingleTap, я получу ошибку из-за множественного столкновения параметров ['x', 'y'].Я посмотрел на link_inputs в разделе «реагирование на события», но он работает с клоном, и я попытался и не смог настроить его на динамических картах.Кто-нибудь может привести пример или указать мне правильное направление, как это сделать?

import holoviews as hv
import numpy as np
hv.extension('bokeh')

def image_extract(energy=0):
    # create a random image as a substitute for looking up the
    # real data 
    return hv.Image(np.random.rand(10,10))

def extract_curve(x=0,y=0,energy=0):
    # create a random curve as a substitute for looking up
    # the real data
    x=np.arange(1000)
    return hv.Curve((x,np.random.rand(1000)),"Counts","channels")

# number of images 
nimages = 1

dmap_list=[]
pointer_list=[]
for i in range(nimages):
    img_dmap = hv.DynamicMap(image_extract, kdims=['energy']).redim.range(energy=(0,90))
    pointer = hv.streams.SingleTap(x=0,y=0, source=img_dmap,subscribers=[],transient=False)
    pointer_list.append(pointer)
    pointer_dmap = hv.DynamicMap(lambda x,y: hv.Points([(x, y)]), streams=[pointer])
    img =img_dmap*pointer_dmap
    dmap_list.append(img)
dmap_list.append(hv.DynamicMap(extract_curve,kdims=['energy'],streams=pointer_list).redim.range(energy=(0,90)))

layout = hv.Layout(tuple(dmap_list)).cols(2)
layout

1 Ответ

0 голосов
/ 29 ноября 2018

Он использует наведение вместо щелчка, но звучит так, как будто вы хотите сделать то, что в http://datashader.org/topics/landsat.html:

tap = hv.streams.PointerXY(source=true_color)
spectrum_curve = hv.DynamicMap(spectrum, streams=[tap]).redim.range(Luminance=(0, 30000))

tiles * regrid(true_color) + spectrum_curve
...