Боке обратный вызов не обновляет график - PullRequest
0 голосов
/ 02 июля 2018

В настоящее время я пытаюсь построить среднее и максимальное значения для информационного кадра на 2 графиках с общим выбором. При выборе на графике 1 я хочу нанести на график данные, которые усредняются на графике 2. Я получаю графики и выделение, но, похоже, не обновляет график с выделением в spyder. Ниже моего кода.

import pandas as pd
import numpy as np
from bokeh.models import ColumnDataSource
from bokeh.plotting import figure, show
from bokeh.layouts import row
from bokeh.io import curdoc

# data for plot 2
df2 = pd.DataFrame(list([[1,1,2,3],[3,4,4,5]]))

source2 = ColumnDataSource(
        data=dict(
            x=list(df2.index.values),
            y=list(df2.iloc[:,0].values)
        )
    )

# data for plot 1 & 0
df1 = np.mean(df2)
df0 = np.max(df2)
source1 = ColumnDataSource(
        data=dict(
            x=list(range(0,df1.shape[0])),
            y=list(df1.values),
            y1=list(df0.values),
                    )
    )

# Plot graph one with data from df1 and source 1 as barplot
plot1 = figure(plot_height=300, plot_width=400, tools="box_select")
barglyph = plot1.circle(x='x',y='y',source=source1)

# Plot graph one with data from df1 and source 1 as barplot
plot0 = figure(plot_height=300, plot_width=400, tools="box_select")
barglyph = plot0.circle(x='x',y='y1',source=source1)



# Plot graph two with data from df2 and source 2 as line
plot2 = figure(plot_height=300, plot_width=400, title="myvalues", 
              tools="box_zoom,reset,save,wheel_zoom,hover")    
r1 = plot2.line(x='x',y='y',source =source2, line_alpha = 1, line_width=1)
# safe data from plot 2 for later change in subroutine
ds1 = r1.data_source

def callback(attr, old, new):
    patch_name =  source1.data['colnames'][new['1d']['indices'][0]]
    ds1.data['y'] = df2[patch_name].values

barglyph.data_source.on_change('selected',callback)
show(row(plot0,plot1,plot2))
curdoc().add_root(row(plot0,plot1,plot2))

Если я запускаю это в jupyter, я получаю ошибку: AttributeError: у объекта «Документ» нет атрибута «ссылки»

1 Ответ

0 голосов
/ 03 июля 2018

Использование реальных обратных вызовов Python, например, для on_change требуется запустить код как серверное приложение Bokeh на сервере Bokeh. Браузер не может запускать код Python. Если вы просто запускаете код как «обычный» скрипт Python python app.py, тогда Python запускает код, генерирует вывод в вашем браузере, а затем интерпретатор Python завершается - в этот момент нет никакого процесса Python для запуска кода обратного вызова , Итак, сервер Bokeh - это постоянный, длительный процесс Python, который существует для запуска реальных обратных вызовов Python в приложениях Bokeh.

Существует несколько способов запуска серверных приложений Bokeh:

  • Как отдельный процесс. Как правило, если код вашего приложения находится в app.py, это означает выполнение команды командной строки, подобной:

    bokeh serve --show app.py
    

    Это откроет сеанс приложения в браузере локально.

  • Встроенный в блокнот Jupyter. В этом случае вы определяете код своего приложения в функции, подобной myapp(doc), которая принимает Bokeh Document и добавляет в этот документ все, что вы хотите (графики, виджеты, инструменты, обратные вызовы и т. Д.). Затем в записной книжке вы выполняете:

    show(myapp) 
    

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

  • Как библиотека, например в колбе приложение. Для получения дополнительной информации об этой опции см. Встраивание сервера Bokeh в виде библиотеки в Руководстве пользователя.

В противном случае, если вы не можете или не хотите запускать сервер Bokeh, можно реализовать множество интерактивных функций, используя обратные вызовы Javascript , которые функционируют в автономных (не серверных) документах Bokeh. ,

...