跨动态地图链接的流

时间:2018-11-21 16:36:06

标签: holoviews

我有一组高光谱数据,一个X,Y,Energy网格,其中每个点都是一个完整的光谱。从这些光谱中,我可以创建图像堆栈,例如图像堆栈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 :(得分:0)

它使用悬停而不是单击,但是听起来您想做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