Обратный вызов Bokeh для изменения исходных данных и всплывающей подсказки - PullRequest
0 голосов
/ 25 мая 2019

Я использую Bokeh для построения данных X / Y.

Значения X и Y создаются отдельно и объединяются в один кадр данных, который будет подавать диаграмму.

Может кто-нибудь объяснить, пожалуйсталучший способ выполнить следующее:

  • Созданный глобальный new_df не используется в качестве источника при запуске обратного вызова источника обновления.Это из-за новых имен столбцов / формы нового источника данных?

  • Настройки инструмента наведения курсора инициализируются только для исходных данных X / Y.Так что он не будет тянуть столбцы «Extra_Info» во втором примере new_df.Каков наилучший способ заставить Hover Tool принимать дополнительные столбцы?Является ли переустановка Hover Tool внутри функции обратного вызова способом сделать это?

Вот мой полуработающий пример.Цени любую помощь.

#Imports
import bokeh
import numpy as np
import pandas as pd
from random import randint
from bokeh.layouts import column, row
from bokeh.models.widgets import Button
from bokeh.plotting import figure, curdoc, show
from bokeh.models import ColumnDataSource, HoverTool


#Creating first data source
df1 = pd.DataFrame(np.random.randint(0, 100, size = (3000, 2)), 
                   columns = ["X", "Y"], 
                   index = [str(i) for i in range(1, 3000 + 1)])

pointchart_source = ColumnDataSource(df1)
pointchart = figure(plot_width = 800, plot_height = 700)
pointchart_glyph = pointchart.circle("X", "Y", source = pointchart_source, size = 3.5)

hover=HoverTool(tooltips = [("(X,Y)", "($x{1,111},$y{1,111})")])
pointchart.add_tools(hover)



#Button and calback to switch source data
def on_switch_button_click():
    global new_df
    pointchart_source.data = ColumnDataSource.from_df(new_df)

    #Should probably plugging in new data as a dictionary.
    #pointchart_source.data = {'X': newdataframe['X'].values, 'Y': newdataframe['Y'].values, 'index': newdataframe.index.values}

switch_button = Button(label = "Switch", button_type = "success")
switch_button.on_click(on_switch_button_click)


#Option I
#Making a changed data source. Combined two 1D into a DF.
x=pd.DataFrame({'X_Value_For_Plot':[randint(1, 100) for i in range(0,10)], 'Common_Column':['a','b','c','d','e','f','g','h','i','j']})
y=pd.DataFrame({'Y_Value_For_Plot':[randint(1, 100) for i in range(0,10)], 'Common_Column':['a','b','c','d','e','f','g','h','i','j']})

new_df = x.merge(y,on='Common_Column')



#Option II
#Making another data source with extra columns for the Hover Tool. 
x=pd.DataFrame({'X_Value_For_Plot':[randint(1, 100) for i in range(0,10)], 
                'X_Extra_Info':['abc','cba','sgc','ddh','eda','fdv','gdy','hsy','dsi','jdu'],
                'Common_Column':['a','b','c','d','e','f','g','h','i','j']})


y=pd.DataFrame({'Y_Value_For_Plot':[randint(1, 100) for i in range(0,10)], 
                'Y_Extra_Info':['hsa','bsv','dyc','sdd','eac','eyf','scg','dyh','isq','jst'],
                'Common_Column':['a','b','c','d','e','f','g','h','i','j']})

new_df = x.merge(y,on='Common_Column')

1 Ответ

1 голос
/ 25 мая 2019

AFAICT вы делаете вещи более сложными, чем необходимо.Если вы можете создавать списки, массивы или серии для каждого из столбцов в отдельности, что, как вам кажется, то вы можете просто создать dict самостоятельно:

source.data = {
    'X': the_x_data,
    'Y': the_y_data,
    'X_Extra_Info': the_extra_data,
}

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

...