我有以下' 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",)
答案 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)