2016-05-06 1 views
0

У меня есть набор данных, на котором я собираю сводную статистику, и я хотел бы иметь возможность выбрать интересную точку и рассчитать основные необработанные данные в отдельном подфигуры. Код ниже можно запустить из ноутбука jupyter, чтобы посмотреть, как выглядят выходы. В идеале я мог бы щелкнуть точку около (1, 10) в первом сюжете и увидеть исходные данные, сгруппированные вокруг 10 на втором графике.Как подключить графики сводной статистики и необработанных данных с помощью bokeh

Прокомментированный код внизу был моей попыткой определить обратный вызов, но я думаю, что у меня есть фундаментальное непонимание того, как работают taptools и callbacks. Как сообщить bokeh, что он должен вызывать определенную подпрограмму python с конкретными аргументами (на основе точки, на которую я нажал), а затем перезагрузить вторую цифру?

from string import ascii_lowercase 

import numpy as np 
import pandas as pd 

from bokeh.plotting import figure, output_notebook, show, gridplot 
from bokeh.models import ColumnDataSource, widgets, HoverTool, TapTool 

output_notebook() 

class RawPlot(): 
    def __init__(self, fig, col, raw): 
     self.fig = fig 
     self.raw = raw 
     self.circ = self.fig.circle(x='index', y='raw', size=1, 
            source=ColumnDataSource(raw[col].reset_index())) 
    # ideally I would have a callback to RawPlot.update to change the underlying data 
    def update(self, col): 
     self.circ.data_source = ColumnDataSource(self.raw[col].reset_index()) 

# generate the example data 
rawdat = pd.DataFrame(np.random.random((1024, 4)) + np.arange(4)*10, 
         columns=pd.MultiIndex.from_tuples([(s, 'raw') for s in ascii_lowercase[:4]])) 
# compute summary statistics and show in a bokeh figure 
stats = rawdat.describe().T.reset_index() 
pstat = figure() 
pstat.circle(x='index', y='mean', source=ColumnDataSource(stats), size=12) 

# show the raw data of the first column 
praw = figure() 
rawplot = RawPlot(praw, 'a', rawdat) 
# this was my attempt at being able to change which column's raw data was plotted. It failed 
# taptool = pstat.select(type=TapTool) 
# taptool.callback = rawplot.update("@level_0") 
show(gridplot([[pstat, praw]])) 
+0

Это приложение для сервера Bokeh? Затем вы хотите использовать обработчик 'on_change' для источника данных для установки обратного вызова. Атрибут '.callback' предназначен только для установки обратного вызова' CustomJS', то есть обратного вызова JavaScript, который по определению никогда не может вызывать или выполнять какой-либо код python. Если вы хотите отвечать на выборы или события виджета с помощью кода * python *, вам необходимо использовать сервер Bokeh (это основная цель использования прецедента). – bigreddot

+0

Это еще не приложение для сервера bokeh. Я только что нашел соответствующую часть документации боке, которая говорит мне, что я не могу просто сделать все в записной книжке. – Elliot

+0

Альтернатива в записной книжке - 'push_notebook' http://bokeh.pydata.org/en/0.11.1/docs/user_guide/notebook.html#jupyter-interactors В этом примере используются виджеты, но вы можете просто использовать' push_notebook' для обновления данных без виджетов. – bigreddot

ответ

0

Код ниже обрабатывает взаимодействия так, как я хотел. Он функционирует с сервером bokeh достаточно хорошо для тестового примера. Запуск кода из ноутбука не имеет такой же интерактивности, хотя (выбор данных в pstat не обновляет данные в praw). Таким образом, output_notebook и push_notebook закомментированы.

from string import ascii_lowercase 

import numpy as np 
import pandas as pd 

from bokeh.plotting import figure, show, gridplot 
from bokeh.models import ColumnDataSource, widgets, HoverTool, TapTool, BoxSelectTool 
from bokeh.io import output_notebook, push_notebook, output_server 
from bokeh.resources import INLINE 

# generate the example data 
rawdat = pd.DataFrame(np.random.random((1024, 4)) + np.arange(4)*10, 
         columns=pd.MultiIndex.from_tuples([(s, 'raw') for s in ascii_lowercase[:4]])) 
# compute summary statistics and show in a bokeh figure 
stats = rawdat.describe().T.reset_index() 
statsource = ColumnDataSource(stats[['mean']]) 

TOOLS = [TapTool(), BoxSelectTool()] 
pstat = figure(tools=TOOLS) 
pstat.circle(x='index', y='mean', source=statsource, size=12) 

# show the raw data of the first column 
praw = figure() 
col = rawdat.columns.levels[0][0] 
rawsource = ColumnDataSource(rawdat[col].reset_index()) 
circ = praw.circle(x='index', y='raw', size=1, 
        source=rawsource) 

# update the raw data_source when a new summary is chosen 
def update(attr, old, new): 
    ind = new['1d']['indices'][0] 
    col = rawdat.columns.levels[0][ind] 
    rawsource.data['raw'] = rawdat[col].values.ravel() 
    # push_notebook() 
statsource.on_change('selected', update) 

# serve the figures 
output_server("foo") 
# output_notebook() 
show(gridplot([[pstat, praw]])) 

 Смежные вопросы

  • Нет связанных вопросов^_^