我正在对多个类别的数据集进行Bokeh可视化。视觉效果的初始部分是类别的甜甜圈图,显示每个类别中项目的总数。我正在尝试使用RangeSlider
根据最小-最大范围来更新图表-但图表不会更新。
字形的输入源是create_cat_df
的输出-作为熊猫DF返回,然后使用ColumnDataSource.from_df()
转换为CDS。
运行此代码(滑块在旁边)后,图表看起来还不错-但是移动滑块不会改变任何内容。
有类似的帖子here。
此处的答案对于将我置于from_df
上很有用-但是即使按照此方法,我也无法使代码正常工作。
def create_doc(doc):
### INPUT widget
cat_min_max = RangeSlider(start=0, end=1000, value=[0, 1000], step=1, title="Category min-max items (m)")
inputs = column(cat_min_max, width=300, height=850) # in preparation for multiple widgets
### Tooltip & tools
TOOLTIPS_2 = [("Item", "$item") # a sample
]
hover_2 = HoverTool(tooltips=TOOLTIPS_2, names = ['cat'])
tools = [hover_2, TapTool(), WheelZoomTool(), PanTool(), ResetTool()]
### Create Figure
p = figure(plot_width=width, plot_height=height, title="",
x_axis_type=None, y_axis_type=None,
x_range=(-420, 420), y_range=(-420, 420),
min_border=0, outline_line_color=None,
background_fill_color="#f0e1d2",
tools = tools, toolbar_location="left")
p.xgrid.grid_line_color = None
p.ygrid.grid_line_color = None
# taptool
url = "https://google.com/" #dummy URL
taptool = p.select(type=TapTool)
taptool.callback = OpenURL(url=url)
# create cat_source CDS using create_cat_df function (returns pandas df) and 'from_df' method
cat_source = ColumnDataSource.from_df(create_cat_df(cat_min_max.value[0], cat_min_max.value[1]))
## plot category wedges
p.annular_wedge('centre_x', 'centre_y', 'inner', 'outer', 'start', 'end', color='color',
alpha='alpha', direction='clock', source=cat_source, name='cat')
r = row([inputs, p])
def callback(attr, old, new):
cat_source.data = ColumnDataSource.from_df(create_cat_df(cat_min_max.value[0], cat_min_max.value[1]))
cat_min_max.on_change('value', callback)
doc.add_root(r)
show(create_doc)
我想使代码正常工作并更新图表。还有更多的字形和不同的数据层可以叠加,但是我想让基础知识首先起作用。
答案 0 :(得分:1)
根据Bokeh documentation,ColumnDataSource.from_df()
方法将返回一个字典,而您需要将ColumnDatSource
传递给source
中的p.annular_wedge(source = cat_source)
自变量
所以代替:
cat_source = ColumnDataSource.from_df(create_cat_df(cat_min_max.value[0], cat_min_max.value[1]))
您应该这样做:
cat_source = ColumnDataSource(data = ColumnDataSource.from_df(create_cat_df(cat_min_max.value[0], cat_min_max.value[1])))