Bokeh RuntimeError: Модели должны принадлежать только одному документу, Selection (id = '1057', ...) уже находится в документе - PullRequest
0 голосов
/ 05 ноября 2019

Я пытаюсь построить несколько графиков в Bokeh, но я получаю следующую ошибку:

RuntimeError: Models must be owned by only a single document, Selection(id='1057', ...) is already in a doc.

Я знаю, что это происходит при попытке использовать одни и те же объекты в нескольких документах, но я неЯ не понимаю, где я это делаю. Вот весь (упрощенный) код.

Я использую Bokeh 1.4.0.

from bokeh.plotting import figure, show
from bokeh.layouts import row, gridplot
from bokeh.models import ColumnDataSource
from bokeh.io import output_file
import pandas as pd

feature_groups  = [['ciao'],['bye']]


df = pd.DataFrame.from_dict({'x':[0,1,2,3,4], 'y':[2,3,4,5,6]})
x_test = [0,1,2,3,4]
y_test = [2,3,4,5,6]
source = ColumnDataSource(df)


for features_columns in feature_groups:
    output_file('features_labels' + features_columns[0] +'.html')
    p = []

    for k,f in enumerate(features_columns):
        p_k = figure(title=f)
        p_k.circle(x=f, y='ki', line_width=2, source=source,fill_alpha=0.5,line_alpha=0.5)
        p_k.circle_cross( x=x_test, y=y_test, color='red',fill_alpha=0.5,line_alpha=0.5)
        p_k.circle_cross( x = x_test, y = y_test, color='green',fill_alpha=0.5,line_alpha=0.5)
        p_k.xaxis.axis_label = f
        p_k.yaxis.axis_label = 'ki'
        p.append(p_k)
    grid = gridplot(p, ncols=2)
    show(grid)

Заранее спасибо

1 Ответ

1 голос
/ 05 ноября 2019

1) как ошибка говорит, что каждая модель Bokeh (в данном случае экземпляр ColumnDataSource) может быть добавлена ​​в Bokeh Document только один раз, поэтому просто переместите source = ColumnDataSource(df) в цикл for.

РЕДАКТИРОВАТЬ (благодаря bigreddot ): очевидно, вы можете совместно использовать один и тот же source только между глифами и графиками в одном и том же боке Document, а не между разными документами. Такие методы, как output_file, save и show неявно создают новый Bokeh Document, поэтому использование одного и того же source в сочетании с двумя output_file инструкциями в исходном коде всегда вызовет проблему

2) вы ссылаетесь на поля, которые не существуют в вашем ColumnDataSource, например 'ki' и т. Д. Я заменил их на x='x' и y='y'

См. Исправленный и рабочий код ниже:

from bokeh.plotting import figure, show
from bokeh.layouts import row, gridplot
from bokeh.models import ColumnDataSource
from bokeh.io import output_file
import pandas as pd

feature_groups  = [['ciao'],['bye']]

df = pd.DataFrame.from_dict({'x':[0,1,2,3,4], 'y':[2,3,4,5,6]})
x_test = [0,1,2,3,4]
y_test = [2,3,4,5,6]

for features_columns in feature_groups:
    output_file('features_labels' + features_columns[0] +'.html')
    p = []
    source = ColumnDataSource(df)

    for k,f in enumerate(features_columns):
        p_k = figure(title=f)
        p_k.circle(x='x', y='y', line_width=2, source=source,fill_alpha=0.5,line_alpha=0.5)
        p_k.circle_cross( x=x_test, y=y_test, color='red',fill_alpha=0.5,line_alpha=0.5)
        p_k.circle_cross( x = x_test, y = y_test, color='green',fill_alpha=0.5,line_alpha=0.5)
        p_k.xaxis.axis_label = f
        p_k.yaxis.axis_label = 'ki'
        p.append(p_k)
    grid = gridplot(p, ncols=2)
    show(grid)
...