Bokeh Custom JS обратный вызов с использованием ползунка - Карта - патчи - PullRequest
0 голосов
/ 29 апреля 2020

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


# Creating the Slider

slider = Slider(title = 'Day', 
                start = np.min(covidmap['day_of_year']), end = np.max(covidmap['day_of_year']), 
                step = 1, value = np.min(covidmap['day_of_year']))
# This callback triggers the filter when the slider changes
callback = CustomJS(args = dict(source=geosource), 
                    code = """source.change.emit();""")
slider.js_on_change('value', callback)
# Creates custom filter that selects the rows of the month based on the value in the slider
custom_filter = CustomJSFilter(args = dict(slider = slider, 
                                           source = geosource), 
                               code = """
var data = source.data;
                var f = slider.value;
                var indices = [];
                x = data['day_of_year']
                cumsum = data['cumsum']
for (var i = 0; i < source.get_length(); i++){
 if (x[i] == f){
 indices.push(true);
 } else {
 indices.push(false);
 }
}
return indices;
""")
# Uses custom_filter to determine which set of sites are visible
view1 = CDSView(source = geosource, filters = [custom_filter])



#Define a sequential multi-hue color palette.
palette = brewer['YlGnBu'][8]
#Reverse color order so that dark blue is highest obesity.
palette = palette[::-1]
#Instantiate LinearColorMapper that linearly maps numbers in a range, into a sequence of colors. Input nan_color.
color_mapper = LogColorMapper(palette = palette, low = 0, high = 100000, nan_color = '#d9d9d9')
#Create color bar. 
color_bar = ColorBar(color_mapper=color_mapper, label_standoff=8,width = 500, height = 20,
                     border_line_color=None,location = (0,0), orientation = 'horizontal')
#Create figure object.
p = figure(plot_height = 600 , 
           plot_width = 950, 
          x_range=(2000000,5500000), y_range=(2500000,5500000))
p.xgrid.grid_line_color = None
p.ygrid.grid_line_color = None

# Adding map tile
p.add_tile(tile_provider)

#Add patch renderer to figure. 
p.patches('xs','ys', source = geosource,fill_color = {'field' :'cumsum', 'transform' : color_mapper},
          line_color = 'black', line_width = 0.25, fill_alpha = 1, view=view1)
#Specify layout
p.add_layout(color_bar, 'below')

# Make a column layout of widgetbox(slider) and plot, and add it to the current document
layout = column(p,slider)
#Display plot inline in Jupyter notebook
output_notebook()
#Display plot
show(layout)

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

случаи смерти cumsum num_days геометрия CNTRY_NAME day_of_year

0 2.0 0.0 2.0 1 Албания ПОЛИГОН ((2314546,339 4928852,306, 2314022,746 ... 69

1 4,0 0,0 6,0 2 Албания ПОЛИГОН ((2314546,339 4928852,306, 2314022,746 ... 70

2 4,0 0,0 10,0 3 Албания ПОЛИГОН ( 2314546.339 4928852.306, 2314022.746 ... 71

3 1.0 1.0 11.0 4 Албания POLYGON ((2314546.339 4928852.306, 2314022.746 ... 72

После этого я использовал приведенный ниже код для преобразования его в GeoJSONDataSource, который это то, что я использовал для построения карты

#Read data to json.
merged_json = json.loads(covidmap.to_json())
#Convert to String like object.
json_data = json.dumps(merged_json)

#Input GeoJSON source that contains features for plotting.
geosource = GeoJSONDataSource(geojson = json_data)

...