代码之家  ›  专栏  ›  技术社区  ›  user2896120

有没有办法重画波基图?

  •  0
  • user2896120  · 技术社区  · 6 年前

    我有两个Bokeh图表和一个输入框。输入框接受一个值,并应更新两个图表。我有一个函数 createDF 创建一个DF,然后调用 createPlot 它返回一个数字到 创建DF 然后 创建DF 电话 createDF2 打电话来 createPlot2 然后返回一个数字 创建DF . 现在我们有两个数字 创建DF ,我们将其打包成一个列表并返回,然后显示如下图表:

    plot = createDF(market)
    l = layout([[text_input], [plot[0]], [plot[1]]])
    curdoc().add_root(l)
    

    这就是我尝试处理更新的方式:

    def text_handler(attr, old, new):
        market = text_input.value
        plot = createDF(market)
    
        l = layout([[text_input], [plot[0]], [plot[1]]])
        curdoc().add_root(l)
    text_input.on_change('value', text_handler)
    

    然而,每当我输入一个不同的市场,图表不会更新。我怎样才能让他们更新?

    1 回复  |  直到 6 年前
        1
  •  3
  •   bigreddot    5 年前

    你只需要检查两个可能的细节:

    你在服务器模式下运行bokeh吗?这是必需的,因为您正在使用python回调函数(文本处理程序)

    https://docs.bokeh.pydata.org/en/latest/docs/user_guide/server.html

    另一个可能的问题是:在回调函数中创建新的图形对象,而不是操作已经存在的对象。

    看看bokeh画廊的一个例子:

    https://github.com/bokeh/bokeh/blob/master/examples/app/movies/main.py

    将创建绘图和图示符:

    p = figure(plot_height=600, plot_width=700, title="", toolbar_location=None, tooltips=TOOLTIPS)
    p.circle(x="x", y="y", source=source, size=7, color="color", line_color=None, fill_alpha="alpha")
    

    然后,在更新函数中,它们修改现有实例:

    def update():
        df = select_movies()
        x_name = axis_map[x_axis.value]
        y_name = axis_map[y_axis.value]
    
        p.xaxis.axis_label = x_axis.value
        p.yaxis.axis_label = y_axis.value
        p.title.text = "%d movies selected" % len(df)
        source.data = dict(
            x=df[x_name],
            y=df[y_name],
            color=df["color"],
            title=df["Title"],
            year=df["Year"],
            revenue=df["revenue"],
            alpha=df["alpha"],
        )
    

    如果保留对glyph对象的引用:

    my_glyph = p.circle(x="x", y="y", source=source, size=7, color="color", line_color=None, fill_alpha="alpha")
    

    您可以稍后(在回调函数中)更改数据源的系列(列),其中的值应来自或大小:

    my_glyph.y = 'other_column_name'
    my_glyph.size = 42