HoloViews DynamicMap с потоком только один раз передает вывод на IPython - PullRequest
0 голосов
/ 03 апреля 2019

Я борюсь с тем, что код внутри функции потока только один раз передается в IPython.Другими словами, display() вызовы из DynamicMap выполняются только один раз (click = hv.DynamicMap(interactive_click, streams=[SingleTap()])).

Это всего лишь простой пример, но в моем реальном случае использования у меня есть display(Javascript('')) код, который мне нуженчтобы выполнить.

# problem: display statement not returned to Jupyter Notebook
import numpy as np
import holoviews as hv
from holoviews import opts
from holoviews.streams import SingleTap
# from IPython.display import Javascript
hv.extension('bokeh')

# triggered when clicking on a plot
def interactive_click(x, y):
    # problem: Only executed once
    display("init")
    if None not in [x, y]:
        # problem: never executed, because `display()` is not passed to Jupyter Notebook
        display(x)
    else:
        x = 0
    return hv.VLine(x).opts(color='green')

# random plot: http://holoviews.org/reference/elements/bokeh/Image.html
ls = np.linspace(0, 10, 200)
xx, yy = np.meshgrid(ls, ls)

bounds=(-1,-1,1,1)   # Coordinate system: (left, bottom, right, top)
img = hv.Image(np.sin(xx)*np.cos(yy), bounds=bounds)

# do something when clicked on plot
click = hv.DynamicMap(interactive_click, streams=[SingleTap()])

# show plot and trigger code on-press
img * click

display("init") отображается только один раз в выходной ячейке и display(x) никогда (потому что первый вход (None, None)).Это простой пример, но в моем случае я хочу выполнить Javascript, однако он может быть выполнен только в том случае, если вывод display() передается ядру IPython.

Я знаю, что код выполняется,потому что зеленая линия на графике движется:

HoloViews plot interaction

Вопрос

Кто-нибудь знает, как я могу display(x) показать вывод вданный пример (означает, что вывод на экран передается ядру IPython в Jupyter Notebook)?

1 Ответ

0 голосов
/ 03 апреля 2019

Решение стало возможным благодаря display_id, как намекнул @philippjfr на pyviz Gitter .

Мы добавили следующий код выше def interactive_click(x, y):

# create a display that we later update
display("None", display_id="click_value")

и обновить display(x) до display(x, display_id="click_value")

Если теперь щелкнуть график, мы увидим, что «Нет» изменилось на значение x вашего щелчка мыши.

Это также работает с Javascript: display(Javascript('element.text("test");'), display_id="click_value")


Полный код:

# problem: display statement not returned to Jupyter Notebook
import numpy as np
import holoviews as hv
from holoviews import opts
from holoviews.streams import SingleTap
# from IPython.display import Javascript
hv.extension('bokeh')

# create a display that we later update
display("None", display_id="click_value")

# triggered when clicking on a plot
def interactive_click(x, y):
    # problem: Only executed once
    # display("init")
    if None not in [x, y]:
        # problem solved
        display(x, display_id="click_value")
        # display(Javascript('element.text("test");'), display_id="click_value")
    else:
        x = 0
    return hv.VLine(x).opts(color='green')

# random plot: http://holoviews.org/reference/elements/bokeh/Image.html
ls = np.linspace(0, 10, 200)
xx, yy = np.meshgrid(ls, ls)

bounds=(-1,-1,1,1)   # Coordinate system: (left, bottom, right, top)
img = hv.Image(np.sin(xx)*np.cos(yy), bounds=bounds)

# do something when clicked on plot
click = hv.DynamicMap(interactive_click, streams=[SingleTap()])

# show plot and trigger code on-press
img * click
...