无法使用Bokeh服务器进行交互式更新渲染器(即圆,三角形等)的大小



我能够更新散布服务器中渲染器的颜色和线条宽度,但是如果我尝试更新"大小",则什么都不会发生。您可以在颜色框中输入颜色(黑色,绿色,蓝色等(,并且渲染器会更改颜色。我一直在调整滑块。代码在下面。如果将glyph.size更改为update_size方法中的glyph.line_width,则该图确实会更新行宽度,但使用" size",什么也不会发生。我正在使用Python 2.7.12,Ubuntu 16.04,Bokeh Server 0.12.5和Tornado 4.4.2。感谢您的帮助。

import numpy as np
from bokeh.io import curdoc
from bokeh.layouts import row, widgetbox
from bokeh.models import ColumnDataSource
from bokeh.models.widgets import Slider, TextInput
from bokeh.plotting import figure
# Set up data
N = 200
x = np.linspace(0, 4*np.pi, N)
y = np.sin(x)
source = ColumnDataSource(data=dict(x=x, y=y))
# Set up widgets
text = TextInput(title="title", value='my sine wave')
text2 = TextInput(title="size", value='6')
text3 = TextInput(title="color", value='red')
offset = Slider(title="offset", value=0.0, start=-5.0, end=5.0, step=0.1)
amplitude = Slider(title="amplitude", value=1.0, start=-5.0, end=5.0)
phase = Slider(title="phase", value=0.0, start=0.0, end=2*np.pi)
freq = Slider(title="frequency", value=1.0, start=0.1, end=5.1)
# Set up plot
plot = figure(plot_height=400, plot_width=400, title="my sine wave",
              tools="crosshair,pan,reset,save,wheel_zoom",
              x_range=[0, 4*np.pi], y_range=[-2.5, 2.5])
r = plot.circle('x', 'y', source=source, size=int(text2.value), line_alpha=0.6, color = text3.value, legend = 'test')
glyph = r.glyph
# Set up callbacks
def update_title(attrname, old, new):
    plot.title.text = text.value
text.on_change('value', update_title)
def update_size(attrname, old, new):
    glyph.size = int(text2.value)    
text2.on_change('value', update_size)
def update_color(attrname, old, new):
    glyph.fill_color = text3.value

text3.on_change('value', update_color)
def update_data(attrname, old, new):
    # Get the current slider values
    a = amplitude.value
    b = offset.value
    w = phase.value
    k = freq.value
    # Generate the new curve
    x = np.linspace(0, 4*np.pi, N)
    y = a*np.sin(k*x + w) + b
    source.data = dict(x=x, y=y)
for w in [offset, amplitude, phase, freq]:
    w.on_change('value', update_data)

# Set up layouts and add to document
inputs = widgetbox(text, text2, text3, offset, amplitude, phase, freq)
plot.legend.location = "top_left"
plot.legend.click_policy="hide"
curdoc().add_root(row(inputs, plot, width=800))
curdoc().title = "Sliders"

如果更改大小,则立即不会发生。但是,如果您稍后进行另一个更改(例如,擦洗一个滑块(,那么大小确实会更新,因此这绝对是某种错误。我建议提交一个GitHub问题:

http://github.com/bokeh/bokeh/issues

同时,将CD中的大小存储在问题上是可行的:

# Set up data
N = 200
x = np.linspace(0, 4*np.pi, N)
y = np.sin(x)
s = np.ones_like(y) * 6
source = ColumnDataSource(data=dict(x=x, y=y, size=s))

然后使用字形调用中的大小列:

r = plot.circle('x', 'y', size='size', source=source, 
                line_alpha=0.6, color = text3.value, legend = 'test')

最终更改回调以更新源:

def update_size(attrname, old, new):
    source.data['size'] = np.ones_like(y) * int(text2.value)

最新更新