散景:根据选择下拉列表中的值不会更新绘图

时间:2018-02-08 12:00:18

标签: python python-3.x bokeh

我有以下' df'我尝试根据从年份分组的下拉列表中选择的状态来绘制图表。

S.No    STATE   YEAR    ColA    ColB
1.        IN    2013    150     200
2.        MA    2013    200     250
3.        IN    2015    300     300

代码如下:

df = pd.read_csv('dfyears.csv')

source = ColumnDataSource(df)

p = figure()
r = p.vbar(x='YEAR', top='colA', width=1,
         source = source)

select_state = Select(title="Option:", value="IN", options= df.STATE.unique().tolist())

def update_plot(attrname, old, new):
    if select_state.value == 'IN':
        newSource = df.groupby(['YEAR','ColA']).sum().to_dict('list')
    if select_state.value == 'MA':
        newSource = df.groupby(['YEAR','ColA']).sum().to_dict('list')
    source.data =  newSource 

select_state.on_change('value', update_plot)
layout = column(row(select_state, width=400), p)
curdoc().add_root(layout)

STATE值显示在下拉列表中,但是绘图没有相应更新,当我尝试在服务器中运行app时出现以下错误。

error handling message Message 'PATCH-DOC' (revision 1): UnboundLocalError("local variable 'newSource' referenced before assignment",)

1 个答案:

答案 0 :(得分:0)

你的代码有很多错误,有些部分不正确。我认为你需要这样的东西。

df = pd.DataFrame({'STATE':['IN','MA','IN','MA','IN'],
                   'YEAR':[2013,2013,2015,2015,2016],
                   'ColA':[150,200,300,350,400],
                   'ColB':[400,550,600,850,900]})

source = ColumnDataSource(df[df['STATE']=='IN'].groupby('YEAR').sum())

p = figure()
r = p.vbar(x='YEAR', top='ColA', width=1,
         source = source)

select_state = Select(title="Option:", value="IN", options= df.STATE.unique().tolist())

def update_plot(attrname, old, new):

    source.data = ColumnDataSource(df[df['STATE']==select_state.value].groupby('YEAR').sum()).data

select_state.on_change('value', update_plot)
layout = column(row(select_state, width=400), p)
curdoc().add_root(layout)