Hi,
I get an error if the figure x_range categorial values are not the same as the source. Below I use a CDSView to filter data to only show Apples category. If one does not want empty space for the other categories in fruits, it would be natural to change the figure x_range to only the fruits that are filtered. But this gives an error in the browser:
Bokeh Error
undefined is not an object (evaluating 'this._mapping[t[0]].value')
Not sure if I am doing something wrong? Any help appreciated. Thanks
···
from bokeh.core.properties import value
from bokeh.io import show, output_file
from bokeh.models import ColumnDataSource, HoverTool, CDSView, BooleanFilter
from bokeh.plotting import figure
from bokeh.transform import dodge
output_file(“dodged_bars.html”)
fruits = [‘Apples’, ‘Pears’, ‘Nectarines’, ‘Plums’, ‘Grapes’, ‘Strawberries’]
years = [‘2015’, ‘2016’, ‘2017’]
data = {‘fruits’ : fruits,
‘2015’ : [2, 1, 4, 3, 2, 4],
‘2016’ : [5, 3, 3, 2, 4, 6],
‘2017’ : [3, 2, 4, 4, 5, 3]}
source = ColumnDataSource(data=data)
fruits2 = [‘Apples’] # new x_range to use
view=CDSView(source = source, filters=[BooleanFilter(
[True if fruit == fruits2[0] else False for fruit in source.data[‘fruits’]])])
p = figure(x_range=fruits2, y_range=(0, 10), plot_height=250,
title=“Fruit Counts by Year”,
toolbar_location=None, tools="")
r_15=p.vbar(x=dodge(‘fruits’, -0.25, range=p.x_range), top=‘2015’,
width=0.2, source=source, color="#c9d9d3",
legend=value(“2015”), fill_alpha = 0.6, hover_alpha = 1,
hover_color = “#c9d9d3”, view = view)
r_16=p.vbar(x=dodge(‘fruits’, 0.0, range=p.x_range), top=‘2016’,
width=0.2, source=source, color="#718dbf",
legend=value(“2016”), fill_alpha = 0.6, hover_alpha = 1,
hover_color ="#718dbf", view = view)
r_17=p.vbar(x=dodge(‘fruits’, 0.25, range=p.x_range), top=‘2017’,
width=0.2, source=source, color="#e84d60",
legend=value(“2017”), fill_alpha = 0.6, hover_alpha = 1,
hover_color = “#e84d60”, view = view)
p.x_range.range_padding = 0.1
p.xgrid.grid_line_color = None
p.legend.location = “top_left”
p.legend.orientation = “horizontal”
p.add_tools(HoverTool(renderers = [r_15,r_16,r_17],tooltips= None))
show(p)