У меня есть набор данных, на котором я собираю сводную статистику, и я хотел бы иметь возможность выбрать интересную точку и рассчитать основные необработанные данные в отдельном подфигуры. Код ниже можно запустить из ноутбука 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]]))
Это приложение для сервера Bokeh? Затем вы хотите использовать обработчик 'on_change' для источника данных для установки обратного вызова. Атрибут '.callback' предназначен только для установки обратного вызова' CustomJS', то есть обратного вызова JavaScript, который по определению никогда не может вызывать или выполнять какой-либо код python. Если вы хотите отвечать на выборы или события виджета с помощью кода * python *, вам необходимо использовать сервер Bokeh (это основная цель использования прецедента). – bigreddot
Это еще не приложение для сервера bokeh. Я только что нашел соответствующую часть документации боке, которая говорит мне, что я не могу просто сделать все в записной книжке. – Elliot
Альтернатива в записной книжке - 'push_notebook' http://bokeh.pydata.org/en/0.11.1/docs/user_guide/notebook.html#jupyter-interactors В этом примере используются виджеты, но вы можете просто использовать' push_notebook' для обновления данных без виджетов. – bigreddot