Python: как динамически изменять параметры в Bokeh, выбрать виджет? - PullRequest
0 голосов
/ 23 мая 2019

У меня есть фрейм данных, который содержит названия стран и городов

from bokeh.io import curdoc
from bokeh.layouts import row, column, widgetbox,layout

from bokeh.models import ColumnDataSource, Select
import pandas as pd

df = pd.DataFrame()
df['City'] = ['None', 'Paris', 'Lione', 'Rome','Milan', 'Madrid', 'Barcelona' ]
df['Country']   = ['None', 'France', 'France', 'Italy', 'Italy', 'Spain', 'Spain']

Я хотел бы иметь два виджета, один для стран, а другой для городов.

select_country = Select(title="Country",  options=list(df['Country']), value = '')
select_city = Select(title = 'City', value = '', options = list(df['City']))

Iхотел бы изменить параметры в городе, если я выберу другой Country

def update_layout(attr, old, new):
    country_selected = select_country.value
    tmp = df[df['Country']==country_selected]
    select_city = Select(title = 'City', value = '', options = list(tmp['City']))

controls = widgetbox(select_country, select_city)
select_country.on_change('value', update_layout)
select_city.on_change('value', update_layout)
layout = column(row(controls))
curdoc().add_root(layout)

1 Ответ

1 голос
/ 23 мая 2019

Вот код, который динамически обновляет параметры во втором виджете Select (Bokeh v1.1.0)

from bokeh.io import curdoc
from bokeh.models import Select, Column
import pandas as pd

df = pd.DataFrame()
df['France'] = ['Paris', 'Lione', 'Marseille']
df['Italy'] = ['Rome','Milan', 'Rimini']
df['Spain'] = ['Madrid', 'Barcelona', 'Bilbao']
df['Country']   = ['France', 'Italy', 'Spain']

select_country = Select(title="Country",  options=list(df['Country']), value = 'France')
select_city = Select(title = 'Cities', value = 'Paris', options = list(df['France']))

def update_layout(attr, old, new):
    country_selected = select_country.value
    select_city.options = list(df[country_selected].values)

select_country.on_change('value', update_layout)
select_city.on_change('value', update_layout)
layout = Column(select_country, select_city)
curdoc().add_root(layout)
...