Выберите виджет для фильтрации на сервере Bokeh - PullRequest
0 голосов
/ 07 декабря 2018

Я новичок в Bokeh и пытаюсь выполнить, казалось бы, простую задачу.Я хочу построить окружности координат x, y населенных пунктов в df вместе с виджетом Select, позволяющим пользователю фильтровать по df['OwnerName'].

Образец df:

  LocalityName OwnerName  MatureFemaleLice             x             y
0   NORD LEKSA      AUSS              0.01  1.047429e+06  9.246246e+06
1    KJELNESET       MHG              0.00  1.267795e+06  9.515210e+06
2       DÅVØYA      AUSS              0.05  2.153038e+06  1.109226e+07
3     OLANESET       GSF              0.02  2.480031e+06  1.113814e+07
4     RAKKENES       MHG              0.01  2.418971e+06  1.103141e+07

Я считаю, что должен использовать функцию обратного вызова, но не уверен, как это лучше всего сделать.Код, который у меня есть:

source = ColumnDataSource(df)

# web mercator coordinates
Norway = x_range, y_range = ((1e5, 32e5), (80e5, 115e5))

# Customize hover tool
hover = HoverTool(
    tooltips = [
    ('Locality', '@LocalityName'),
    ('MatureFemaleLice', '@MatureFemaleLice')
    ])

# Create plot
p = figure(width=800, height=800,
       tools=['pan', 'wheel_zoom', hover],
       toolbar_location = 'above',
       x_range=x_range, 
       y_range=y_range, 
       x_axis_type="mercator",
       y_axis_type="mercator")

# Add map tile
p.add_tile(CARTODBPOSITRON_RETINA)

# Add circle on plot for localities
p.circle(x='x', y='y', size=10, source=source, fill_alpha = 0.5)

# Create widget for selecting owner filter
select = Select(title='Owner', value='OwnerName', 
                options=df.OwnerName.unique().tolist())

def select_callback(attr, old, new):
    # NEED HELP TO WRITE THIS PART

# IS THIS RIGHT?
select.on_change('value', select_callback)

# Add figure and widget to the document
curdoc().add_root(column(select, p))

Я подумал, что один из способов сделать это, кажется, будет в порядке:

def select_callback(attr, old, new):
    selected = select.value
    if selected == 'Include all':
        new_data = df
    else:
        new_data =df[df.OwnerName == selected]

source.data = ColumnDataSource(new_data).data

select.on_change('value', select_callback)
...