График боке не обновляется при выборе раскрывающегося меню

Я пытаюсь использовать боке для создания интерактивного сюжета солнечных (дневных) часов в разных городах. В качестве руководства я использовал пример «погода» из галереи Боке, так как это моя первая попытка использовать Боке. Сюжет работает, но не обновляется при выборе нового города в раскрывающемся меню. Буду признателен за помощь в выявлении моей ошибки. Я создал несколько примеров точек данных для этой простой иллюстрации; фактический код будет читать файл hdf.

Код:

import pandas as pd
from bokeh.io import curdoc
from bokeh.layouts import row, column
from bokeh.models import ColumnDataSource, DataRange1d, Select
from bokeh.plotting import figure, show
from bokeh.palettes import inferno

variables = ['sunlight_hours']#, 'Sunrise', 'Sunset']

def get_dataset(src, name, plottype):

    df = pd.DataFrame()
    df['date'] = pd.to_datetime(t)
    df['sun'] = src[name]

    return ColumnDataSource(data=df)

def make_plot(source, title, city):
    plot = figure(x_axis_type="datetime", plot_width=800, tools="", toolbar_location=None)
    plot.title.text = title
    plot.line(pd.to_datetime(t),sunlight[city]\
    ,line_width=2,line_color=clrs[1],legend=city)

# fixed attributes
plot.xaxis.axis_label = None
plot.yaxis.axis_label = "Sunlight [hours]"
plot.axis.axis_label_text_font_style = "bold"
#plot.x_range = DataRange1d(range_padding=0.0)
plot.grid.grid_line_alpha = 0.3

return plot

def update_plot(attrname, old, new):
    new_city = city_select.value
    plot.title.text = "Sunlight data for " + new_city

    src_update = get_dataset(sunlight, new_city, plottype_select.value)
    source.data.update(src_update.data)

# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 

i_city = 'Toronto'
plottype = 'sunlight_hours'

# make example data
yr = 2018
sites = pd.Series(['Resolute','Edmonton','Toronto'])
provs = pd.Series(['Nunavut','Alberta','Ontario'])
sunlight = pd.DataFrame()
sunlight['Toronto']  = pd.Series( [10,11,12,13,12,11,10] )
sunlight['Edmonton'] = pd.Series( [6,8,12,14,11,7,5] )
sunlight['Resolute'] = pd.Series( [4,6,10,16,11,5,2] )

t =  pd.date_range('1-1-' + str(yr),periods=7,freq='m')
N =  len(sites)

clrs = inferno(N)

cities = {}
for i in range(0,N):
    cities.update({sites[i]: {'city': sites[i], 'province': 
provs[i],'sun_hrs':sunlight[sites[i]],}})

city_select = Select(value=i_city, title='City', options=sorted(cities.keys()))
plottype_select = Select(value=plottype, title='Plot type', options=['Sunlight']) #, 'Sunrise', 'Sunset'])

source = get_dataset(sunlight, cities[i_city]['city'], plottype)

plot = make_plot(source, "Sunlight data for ",i_city)# + cities[city]['city'])

city_select.on_change('value', update_plot)
plottype_select.on_change('value', update_plot)

controls = column(city_select, plottype_select)

curdoc().add_root(row(plot, controls))
curdoc().title = "Sunlight"

person dan    schedule 27.02.2018    source источник
comment
Вместо source.data.update(src_update.data) попробуйте plot.data_source.data = src_update.data   -  person ChesuCR    schedule 28.02.2018


Ответы (1)


Вы все сделали правильно, за исключением того, как вы проводите линию. Вы использовали данные напрямую вместо ColumnDataSource, поэтому вы правильно обновляете свой источник данных, но ничего не происходит, поскольку он не используется средством визуализации.

изменение

plot.line(pd.to_datetime(t),sunlight[city],line_width=2,line_color=clrs[1],legend=city)

to

plot.line('date','sun',line_width=2,line_color=clrs[1],legend=city,source=source)

Вместо передачи фактических массивов передайте имена источника и поля

person Seb    schedule 28.02.2018