Я пытаюсь использовать боке для создания интерактивного сюжета солнечных (дневных) часов в разных городах. В качестве руководства я использовал пример «погода» из галереи Боке, так как это моя первая попытка использовать Боке. Сюжет работает, но не обновляется при выборе нового города в раскрывающемся меню. Буду признателен за помощь в выявлении моей ошибки. Я создал несколько примеров точек данных для этой простой иллюстрации; фактический код будет читать файл 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"
source.data.update(src_update.data)
попробуйтеplot.data_source.data = src_update.data
- person ChesuCR   schedule 28.02.2018