Смена источника Bokeh - PullRequest
       14

Смена источника Bokeh

0 голосов
/ 15 апреля 2019

Я пытаюсь обновить источник данных для диаграммы рассеяния Боке, используя функцию. Но вместо отображения только новых данных, график показывает все это.

Я думаю, что передаю новый источник данных на график, но старые точки на графике сохраняются.

Как бы вы обновили диаграмму рассеяния только новыми данными?

Кроме того, есть ли способ получить текущий выбор в выпадающем меню, не взаимодействуя с ним? (т.е. без обратного вызова, который использует on_change)

import numpy as np
import pandas as pd
from bokeh.models import ColumnDataSource
from bokeh.models.widgets import Tabs, Select
from bokeh.layouts import column, row, Spacer
from bokeh.io import curdoc
from bokeh.plotting import figure, curdoc, show

#Plotting points on initial chart.
df_AB = pd.DataFrame(np.random.randint(0,100,size=(500, 2)), columns=list('AB'), index=[str(i) for i in range(1,500+1)])
pointchart=figure(plot_width=800, plot_height=700, tools=['lasso_select','box_select'],title="Point scatter")
pointchart_source= ColumnDataSource(df_AB[["A","B"]])
pointchart_glyph= pointchart.circle("A","B",source=pointchart_source)

#Dropdown
selectoroptions=['','new selection', 'other selection']
Xselector = Select(title="Dropdown:", value="", options=selectoroptions)

#Callback to update data source
def Xdropdownchange(attrname, old, new):
        pointchart_glyph= pointchart.circle("X","Y",source=make_updated_source())

Xselector.on_change("value", Xdropdownchange)


#Making new/updated data source based on dropdowns.
df_XY = pd.DataFrame(np.random.randint(0,100,size=(500, 2)), columns=list('XY'), index=[str(i) for i in range(1,500+1)])

def make_updated_source():
    new_x=pd.Series(list(df_XY.iloc[0:100]["X"]),name="X")
    new_y=pd.Series(list(df_XY.iloc[0:100]["Y"]),name="Y")

    sourcedf=pd.DataFrame([new_x,new_y]).T
    pointchart_source= ColumnDataSource(sourcedf)
    return pointchart_source


#Show
layout=row(column(Xselector, Spacer(width=400, height=500)),pointchart)
curdoc().add_root(layout)
!powershell -command {'bokeh serve --show Dropdown_sourcechange.ipynb'}

1 Ответ

1 голос
/ 15 апреля 2019

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

import numpy as np
import pandas as pd
from bokeh.models import ColumnDataSource
from bokeh.models.widgets import Tabs, Select
from bokeh.layouts import column, row, Spacer
from bokeh.io import curdoc
from bokeh.plotting import figure, curdoc, show

#Plotting points on initial chart.
df_AB = pd.DataFrame(np.random.randint(0,100,size=(500, 2)), columns=list('XY'), index=[str(i) for i in range(1,500+1)])
pointchart=figure(plot_width=800, plot_height=700, tools=['lasso_select','box_select','wheel_zoom'],title="Point scatter")
source= ColumnDataSource(df_AB[["X","Y"]])
pointchart.circle("X","Y",source=source)

#Dropdown
selectoroptions=['','new selection', 'other selection']
Xselector = Select(title="Dropdown:", value="", options=selectoroptions)

def make_updated_source(attr, old, new):
    if new == '':
        source.data = ColumnDataSource(df_AB[["X","Y"]]).data
    else:
        df_XY = pd.DataFrame(np.random.randint(0,100,size=(500, 2)), columns=list('XY'), index=[str(i) for i in range(1,500+1)])
        new_x=pd.Series(list(df_XY.iloc[0:100]["X"]),name="X")
        new_y=pd.Series(list(df_XY.iloc[0:100]["Y"]),name="Y")
        sourcedf=pd.DataFrame([new_x,new_y]).T
        source.data = ColumnDataSource(sourcedf).data

Xselector.on_change("value", make_updated_source)

#Retrieve selection in dropdown withoud on_change
print(Xselector.value)

#Show
layout=row(column(Xselector, Spacer(width=400, height=500)),pointchart)
curdoc().add_root(layout)
!powershell -command {'bokeh serve --show Dropdown_sourcechange.ipynb'}
...