Интерактивный выбор на ноутбуке Jupyter с помощью функции «Поднять виджет» ошибка «Модели должны принадлежать только одному документу» - PullRequest
0 голосов
/ 17 февраля 2019

Как создать интерактивную гистограмму с боке через виджет выбора на ноутбуке Jupyter?

Почему в ноутбуке возникает следующая ошибка:

"RuntimeError: Модели должны принадлежать только одному документу, название (id = '1044', ...) уже находится в документе ОШИБКА: tornado.access: 500 GET /autoload.js?bokeh-autoload-element=1002&bokeh-absolute-url = http://localhost:54277&resources=none (:: 1) 117.01ms "

Я внимательно прочитал этот пример из github и подобную ситуацию из Google Bokeh Group , в последнем они запускают сервер bokeh, а не ядро ​​jupyter

output_notebook()

dct={'Date' : ["2018-01-07", "2018-01-12", "2018-01-13", "2018-01-14", "2018-01-20", "2018-01-24"],'Activity' : ['A','B','A','B','A','B'],'Count' : [1, 2, 5, 3, 7, 1]}
df=pd.DataFrame(dct)

activity_list=df['Activity'].unique().tolist().copy()
activity_selected='A'
def modify_doc(doc):
     def make_plot(cdf):
         plot = figure()
         plot.vbar(x=cdf.Date, top=cdf.Count, width=0.9)
         push_notebook()
         show(plot, notebook_handle = True)
         return plot
     def update_plot(attr, old, new):
         activity =  select.value
         sdf = df.copy()
         sdf = sdf[sdf['Activity'] == activity]
         layout.children[0] = make_plot(sdf)


     select = Select(title='Select Activity', value=activity_selected, options=activity_list)
     select.on_change('value', update_plot)
     p=make_plot(df)
     layout=column(select, p)
     doc.add_root(layout)
show(modify_doc)

В снимке я ожидаю что-то вроде этого:

enter image description here

Я использую Bokeh 1.0.4

Ответы [ 2 ]

0 голосов
/ 19 февраля 2019

Правильный код для выбора графика с помощью виджета Select:

activity_list=df['Activity'].unique().tolist().copy()
df['Date']=pd.to_datetime(df['Date'])

activity_selected='A'

def modify_doc(doc):

    df_r=df.copy()
    source = ColumnDataSource(data=df_r)
    plot=figure(title='Daily Hours',x_axis_type="datetime")
    plot.vbar(x="Date", top="Count",source=source, width=4)
    def update_plot(attr, old, new):
        activity =  select.value
        data = df_r[df_r['Activity'] == activity]
        source.data = ColumnDataSource(data=data).data

    select = Select(title='Select Activity', value=activity_selected, options=activity_list)
    select.on_change('value', update_plot)

    layout=column(select, plot)
    doc.add_root(layout)
show(modify_doc)

И это будет вывод, который вы видите:

enter image description here enter image description here

0 голосов
/ 18 февраля 2019

Возможно, нам нужно внести некоторые улучшения в документацию, потому что есть несколько частей вашего кода, которые не имеют смысла.

  • push_notebook дополняет показ реального серверного приложения Bokeh (т.е. передача modify_doc в show).Я не могу придумать ни одной ситуации, в которой имело бы смысл использовать их вместе.Возможности серверного приложения Bokeh являются строгим расширенным набором push_notebook, поэтому, поскольку вы уже создаете серверное приложение Bokeh, вам нужно просто обновить все стандартным способом.

  • show никогда не следует называть внутри кода приложения сервера Bokeh (в данном случае внутри modify_doc). Это фактически является непосредственной причинойисключение вы получаете.Вы должны

  • Вы не должны каждый раз создавать новый сюжет!Общая цель push_notebook и сервера Bokeh состоит в том, что обновления могут происходить эффективно без , каждый раз создавая совершенно новый график.Вы должны обновлять данные и атрибуты существующего графика.

Здесь приведен полный пример работы серверного приложения Bokeh в блокноте:

https://github.com/bokeh/bokeh/blob/master/examples/howto/server_embed/notebook_embed.ipynb

Вы должны изучить и подражать этому какэто представляет лучшую практику.

...