Обновление категориальных уровней в боке. - PullRequest
0 голосов
/ 07 ноября 2018

Основываясь на примере, представленном в галерее веб-сайта bokeh, я добавил выпадающий виджет. Выпадающие значения отображаются в разных списках категориальных уровней. Я бы хотел, чтобы функция update_data_plot обновляла эти уровни и отображала новые дистрибутивы.

from numpy import linspace
from scipy.stats.kde import gaussian_kde

from bokeh.io import output_file, show
from bokeh.models import ColumnDataSource, FixedTicker, PrintfTickFormatter
from bokeh.plotting import figure
from bokeh.sampledata.perceptions import probly
from bokeh.io import curdoc
from bokeh.layouts import row, widgetbox, column
from bokeh.models.widgets import Slider, TextInput, Dropdown

# widgets
menu = [('A','A'), ('B','B')]
dropdown = Dropdown(label="Dropdown button", button_type="warning", menu=menu)


def ridge(category, data, scale=20):
    return list(zip([category]*len(data), scale*data))

def update_data_plot(attrname, old, new):
    """Update the chart to show
    the new categorical levels and
    their distribution"""

cats1 = list(reversed(probly.keys()))[:5]
cats2 = list(reversed(probly.keys()))[5:]


x = linspace(-20,110, 500)

source = ColumnDataSource(data=dict(x=x))

p = figure(y_range=cats1, plot_width=900, x_range=(-5, 105), toolbar_location=None)

for i, cat in enumerate(reversed(cats1)):
    pdf = gaussian_kde(probly[cat])
    y = ridge(cat, pdf(x))
    source.add(y, cat)
    p.patch('x', cat, alpha=0.6, line_color="black", source=source)

p.outline_line_color = None
p.background_fill_color = "#efefef"

p.xaxis.ticker = FixedTicker(ticks=list(range(0, 101, 10)))
p.xaxis.formatter = PrintfTickFormatter(format="%d%%")

p.ygrid.grid_line_color = None
p.xgrid.grid_line_color = "#dddddd"
p.xgrid.ticker = p.xaxis[0].ticker

p.axis.minor_tick_line_color = None
p.axis.major_tick_line_color = None
p.axis.axis_line_color = None

p.y_range.range_padding = 0.12

dropdown.on_change('value',update_data)


curdoc().add_root(column(dropdown,
    p, width=50))
curdoc().title = "Sliders"

1 Ответ

0 голосов
/ 07 ноября 2018

Прошло много времени с тех пор, как я сделал что-то подобное. Я сделал это в местном приложении Bokeh подачи, я не думаю, что я когда-либо работал в ноутбуке. Глядя на мой старый код, обновление source.data на .data нового ColumnDataSource сработало.

def update_data_plot(attrname, old, new):
    new_value = dropdown.value
    # here make something that you can pass to construct a new ColumnDatasource with the new value
    # and put it into a variable called newdata
    source.data = ColumnDataSource(data=newdata).data
...