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

在输入更改时更改bokeh数据源

  •  3
  • JokerMartini  · 技术社区  · 6 年前

    在我的例子中,我收集了水果和蔬菜的数据。数据本身具有相同的键值,即名称和值。

    当用户更改下拉列表时,我想交换条形图中的数据以显示下拉列表选项。我该怎么做呢?我对如何在自定义回调中管理所有这些有点迷茫。

    从bokeh.layouts导入列 从bokeh.models导入customjs、columnDatasource、slider,选择 从bokeh.plotting导入图,输出_文件,显示 从bokeh.models.glyphs导入vbar 将熊猫作为PD导入 #创建数据帧 df_fruit=pd.数据帧({ '值':[3,5,12,21,16], “名称”:[“苹果”、“梨”、“油桃”、“葡萄”、“草莓”] }) source_fruit=列数据源(df_fruit) df_蔬菜=pd.数据框({ '值':[3,4,4], “名字”:[“辣椒”、“土豆”、“胡萝卜”] }) source_vegetables=列数据源(df_vegetables) #绘制数据帧 名称=df_fruit['names'].tolist()) plot=figure(plot_width=500,plot_height=400,title=“数据计数”,x_range=name) plot.vbar(source=source_fruit,x=“name”,top=“values”,bottom=0,width=0.75,color=“red”,fill_alpha=0.7,name='fruits') #输入控件的回调 callback=customjs(args=dict(source=source_-fruit),code=“” var data=source.data; console.log(数据); source.change.emit(); “”) ui_view=select(title=“view”,callback=callback,value=“fruit”,options=[“fruit”,“vegetables”]) callback.args['ui_view']=ui_view #布局 布局=列(ui_视图,绘图) 显示(布局)

    enter image description here

    from bokeh.layouts import column
    from bokeh.models import CustomJS, ColumnDataSource, Slider, Select
    from bokeh.plotting import figure, output_file, show
    from bokeh.models.glyphs import VBar
    import pandas as pd
    
    # create dataframes of data
    df_fruit = pd.DataFrame({
        'values':[3, 5, 12, 21, 16], 
        'names':['Apples', 'Pears', 'Nectarines', 'Grapes', 'Strawberries']
    })
    source_fruit = ColumnDataSource(df_fruit)
    
    df_vegetables = pd.DataFrame({
        'values':[3, 4, 4], 
        'names':['Peppers', 'Potatoes', 'Carrots']
    })
    source_vegetables = ColumnDataSource(df_vegetables)
    
    # plot dataframes
    names = df_fruit['names'].tolist()
    plot = figure(plot_width=500, plot_height=400, title="Data Counts", x_range=names)
    plot.vbar(source=source_fruit, x="names", top="values", bottom=0, width=0.75, color="red", fill_alpha=0.7, name='fruits')
    
    # callback for input controls
    callback = CustomJS(args=dict(source=source_fruit), code="""
        var data = source.data;
        console.log(data);
    
        source.change.emit();
    """)
    
    ui_view = Select(title="View", callback=callback, value="Fruit", options=["Fruit", "Vegetables"])
    callback.args['ui_view'] = ui_view
    
    # layout
    layout = column(ui_view, plot)
    show(layout)
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   bigreddot    6 年前

    当使用分类范围时,与当前范围中的类别不对应的glyph值将被忽略。考虑到这一点,要做的最简单的事情就是预先“绘制”两个数据集,然后更改回调中的范围:

    # plot dataframes
    names = df_fruit['names'].tolist()
    plot = figure(plot_width=500, plot_height=400, title="Data Counts", x_range=names)
    fruit = plot.vbar(source=source_fruit, x="names", top="values", bottom=0, width=0.75, color="red", fill_alpha=0.7, name='fruits')
    veg = plot.vbar(source=source_vegetables, x="names", top="values", bottom=0, width=0.75, color="red", fill_alpha=0.7, name='veg')
    
    # callback for input controls
    callback = CustomJS(args=dict(fruit=fruit, veg=veg, plot=plot), code="""
        if (ui_view.value=="Fruit") {
          plot.x_range.factors = fruit.data_source.data.names
        } else {
          plot.x_range.factors = veg.data_source.data.names
        }
    """)
    
    ui_view = Select(title="View", callback=callback, value="Fruit", options=["Fruit", "Vegetables"])
    callback.args['ui_view'] = ui_view
    
    # layout
    layout = column(ui_view, plot)
    show(layout)