Я пытаюсь объединить функциональность Holoviews Pointdraw с ее функциональностью примера (я не смог найти конкретную страницу, но она показана в действии здесь http://holoviews.org/gallery/demos/bokeh/mandelbrot_section.html)
В частности, я хочу иметь два сюжета с интерактивностью. Один слева показывает цветовую карту, а другой справа показывает образец (отрезок строки) цветовой карты. Это достигается с помощью .sample
. Внутри этого правильного графика я хотел бы иметь точки, которые можно рисовать, перемещать и удалять, как правило, с помощью pointdraw
. Затем я также хотел бы получить доступ к их координатам после завершения перемещения, что возможно, если следовать примеру из документации.
Теперь у меня есть два работающих независимо, следуя приведенным выше примерам. Но в сочетании с тем способом, который у меня есть, это приводит к сюжету, который выглядит следующим образом:
В нем есть элементы, которые я ищу, за исключением точек, с которыми невозможно взаимодействовать. Это как-то связано с потоками Holoviews, но я не уверен, как это решить. Кто-нибудь сможет помочь?
Код, который генерирует выше:
%%opts Points (color='color' size=10) [tools=['hover'] width=400 height=400]
%%opts Layout [shared_datasource=True] Table (editable=True)
import param
import numpy as np
import holoviews as hv
hv.extension('bokeh', 'matplotlib')
from holoviews import streams
def lorentzian(x, x0, gamma):
return 1/np.pi*1/2*gamma/((x-x0)**2+(1/2*gamma)**2)
xs = np.arange(0,4*np.pi,0.05)
ys = np.arange(0,4*np.pi,0.05)
data = hv.OrderedDict({'x': [2., 2., 2.], 'y': [0.5, 0.4, 0.2], 'color': ['red', 'green', 'blue']})
z = lorentzian(xs.reshape(len(xs),1),2*np.sin(ys.reshape(1,len(ys)))+5,1) + lorentzian(xs.reshape(len(xs),1),-2*np.sin(ys.reshape(1,len(ys)))+5,1)
def dispersions(f0):
points = hv.Points(data, vdims=['color']).redim.range(x=(xs[0], xs[-1]), y=(np.min(z), np.max(z)))
point_stream = streams.PointDraw(data=points.columns(), source=points, empty_value='black')
image = hv.Image(z, bounds=(xs[0], ys[0], xs[-1], ys[-1]))
return image* hv.VLine(x=f0) + image.sample(x=f0)*points
dmap = hv.DynamicMap(dispersions, kdims=['f0'])
dmap.redim.range(f0=(0,10)).redim.step(f0=(0.1))
Я прошу прощения за странную функцию, которую мы строим, я не мог сразу придумать простую.