2016-08-24 16 views
0

我想繪製下拉小部件的基於條形圖的值。如何根據散景python中的下拉小部件的值交互地繪製條形圖?

代碼

import pandas as pd 
from bokeh.io import output_file, show 
from bokeh.layouts import widgetbox 
from bokeh.models.widgets import Dropdown 
from bokeh.plotting import curdoc 
from bokeh.charts import Bar, output_file,output_server, show #use output_notebook to visualize it in notebook 


df=pd.DataFrame({'item':["item1","item2","item2","item1","item1","item2"],'value':[4,8,3,5,7,2]}) 

menu = [("item1", "item1"), ("item2", "item2")] 
dropdown = Dropdown(label="Dropdown button", button_type="warning", menu=menu) 


def function_to_call(attr, old, new): 

    df=df[df['item']==dropdown.value]  
    p = Bar(df, title="Bar Chart Example", xlabel='x', ylabel='values', width=400, height=400) 
    output_server()  
    show(p) 

dropdown.on_change('value', function_to_call) 

curdoc().add_root(dropdown) 

問題

  1. 我得到流動錯誤:eventhough DF 「UnboundLocalError賦值之前引用局部變量 'DF'」 已創建。
  2. 如何在下拉菜單下方的網頁上繪製條形圖?在1.中的問題後顯示它的語法是什麼解決?

回答

0

對於1.)在分配它之前引用它。看方括號內的df['item']==dropdown.value在分配前先發生。至於爲什麼這很重要,這就是Python的工作原理。一個函數中的所有賦值默認創建本地變量。但在分配之前,只有全局值可用。 Python告訴你,它不允許在單個函數中混合使用全局/本地。長話短說,重命名df變量的函數內部:

subset = df[df['item']==dropdown.value]  
p = Bar(subset, ...) 

對於2),你需要把事情的佈局(如column)。在項目文檔和畫廊中有很多這樣的例子。

+0

謝謝。 p是函數function_to_call()的本地函數,所以我應該在這個函數中返回p並在curdoc()。add_root(column(dropdown,p))中使用它。 –