Как можно напрямую изменить `_property_values` элемента bokeh` figure.renderers`? - PullRequest
0 голосов
/ 20 февраля 2020

Как можно напрямую изменить _property_values элемента боке figure.renderers? Я узнал, что у lements renderers есть идентификатор, поэтому я ожидаю сделать что-то вроде renderers['12345']. Но так как это список (точнее PropertyValueList), это не работает. Вместо этого, единственное решение, которое я нашел, - это перебрать список, сохранив правильный элемент в новом указателе (?), Изменив указатель и, таким образом, изменив исходный элемент.

Вот мой игрушечный пример, где вертикаль строка в гистограмме обновляется на основе значения некоторого виджета:

import hvplot.pandas
import ipywidgets as widgets
import numpy as np
from bokeh.io import push_notebook, show, output_notebook
from bokeh.models import Span
from bokeh.plotting import figure

%matplotlib inline

hist, edges = np.histogram([1, 2, 2])

p = figure()
r = p.quad(top=hist, bottom=0, left=edges[:-1], right=edges[1:])
vline = Span(location=0, dimension='height')
p.renderers.extend([vline])

def update_hist(x):    
    myspan = [x for x in p.renderers if x.id==vline.id][0]
    myspan._property_values['location'] = x
    show(p, notebook_handle=True)

widgets.interact(update_hist, x = widgets.FloatSlider(min=1, max=2))

1 Ответ

0 голосов
/ 21 февраля 2020

Bigreddot указал мне правильное направление: мне не нужно обновлять p напрямую, но элементы, используемые для генерации p (здесь Span). По этому я нашел этот вопрос , где код несет решение: обновление vline.location.

Полный код:

import hvplot.pandas
import ipywidgets as widgets
import numpy as np
from bokeh.io import push_notebook, show, output_notebook
from bokeh.models import Span
from bokeh.plotting import figure

%matplotlib inline

hist, edges = np.histogram([1, 2, 2])

p = figure()
r = p.quad(top=hist, bottom=0, left=edges[:-1], right=edges[1:])
vline = Span(location=0, dimension='height')
p.renderers.extend([vline])
show(p, notebook_handle=True)

def update_hist(x):    
    vline.location = x
    push_notebook()

widgets.interact(update_hist, x = widgets.FloatSlider(min=1, max=2, step = 0.01))

Как Python новичок, я все еще часто наблюдаю, что Python не имеет переменных . Таким образом, мы можем изменить элемент x, изменив y.

x = ['alice']
y = x
y[0] = 'bob'
x  # is now ['bob] too
...