从滑块更改中回叫,不会在jupyter实验室的bokeh中更新我的情节?

时间:2019-05-03 18:04:24

标签: python python-3.x jupyter bokeh

我正在对多个类别的数据集进行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)

我想使代码正常工作并更新图表。还有更多的字形和不同的数据层可以叠加,但是我想让基础知识首先起作用。

1 个答案:

答案 0 :(得分:1)

根据Bokeh documentationColumnDataSource.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])))