Bokeh更新垂直条形图数据源

3
我正在使用bokeh服务器构建直方图,以动态更改直方图的数据。通过单击按钮应该更改数据源 - 但它并没有按预期工作。
from bokeh.plotting import figure
from bokeh.layouts import layout, widgetbox
from bokeh.io import curdoc
from bokeh.transform import factor_cmap
from bokeh.palettes import Spectral6
from bokeh.models import FactorRange, ColumnDataSource
from bokeh.models.widgets import Button

button = Button(label="ChangeValue", button_type="success")
fruits = ['Apples', 'Pears', 'Nectarines', 'Plums', 'Grapes', 'Strawberries']
val = [5, 3, 4, 2, 4, 6]
data_dict = {'x':fruits,'y':val} 
source_table_hist = ColumnDataSource(data=data_dict)

h = figure(x_range=data_dict['x'],plot_height=350, title="Histogram")
h.vbar(x='x', top='y', width=0.2, source=source_table_hist, legend="x", line_color='black', 
       fill_color=factor_cmap('x', palette=Spectral6, factors=data_dict['x']))

h.xgrid.grid_line_color = None
h.y_range.start = 0

inputs = widgetbox(button)

def update():
    fruits = ['Banana', 'Orange']
    val = [15, 23]
    data_dict = {'x':fruits,'y':val}
    h.x_range=FactorRange(factors=data_dict['x']) 
    source_table_hist.data = data_dict

button.on_click(update)
l = layout([inputs,h])
curdoc().add_root(l)
curdoc().title = "Test"

当您点击按钮时,您期望图表显示什么? - Toby Petty
1个回答

2

Bokeh的创建者们考虑到的使用场景,也是目前最好支持的使用场景,是设置一个应用程序,然后在原地更新数据和属性(即与替换整个对象(如范围)相对)。如果这一行代码

h.x_range=FactorRange(factors=data_dict['x'])  # replace entire range (bad) 

被改为以下内容:

h.x_range.factors=data_dict['x']  # update existing range (good)

新的条形图呈灰色,因为您配置的颜色映射器不知道您更改的新因素。一些选项:
  • 提前为可能设置的所有因素配置颜色映射器
  • 更新颜色映射器的属性以调整新因素
  • 在Python中进行颜色映射(并在CDS中放置“color”列),而不是使用LinearColormapper

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接