У меня есть набор гиперспектральных данных, сетка 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