Bokeh использование Column Data Source и Box_Select - PullRequest
0 голосов
/ 18 ноября 2018

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

Пример кода, который я использую, является примером, называемым Linked Brushing . Я хотел бы посмотреть, смогу ли я получить тот же эффект с моим собственным кодом, ниже. Это объяснение на веб-странице также относится к связанному выделению с отфильтрованными данными , но я не понимаю, что делает код filters=[BooleanFilter([True if y > 250 or y < 100 else False for y in y1] на этой странице, поэтому я не уверен, как его адаптировать или даже отношение.

Вот мой код:

from bokeh.plotting import figure, output_file, show, Column
from bokeh.models import ColumnDataSource, CDSView, BooleanFilter
from MyFiles import *

class bokehPlot:
    def __init__(self, filename, t, a, b, c, d):

        self.source = ColumnDataSource(data=dict(x=t, y1=a, y2=b, y3=c, y4=d))

        p1 = self.makePlot(filename, 'x', 'y1', 'A')
        p2 = self.makePlot(filename, 'x', 'y2', 'B', x_link=p1)
        p3 = self.makePlot(filename, 'x', 'y3', 'C', x_link=p1)
        p4 = self.makePlot(filename, 'x', 'y4', 'D', x_link=p1)

        output_file('scatter_plotting.html', mode='cdn')

        p = Column(p1, p2, p3, p4)
        show(p)

    def makePlot(self,filename,x0,y0,y_label, **optional):

        TOOLS = "box_zoom,box_select,reset"

        p = figure(tools=TOOLS, plot_width=1800, plot_height=300)

        if ('x_link' in optional):
            p0 = optional['x_link']
            p.x_range = p0.x_range

        p.scatter(x=x0, y=y0, marker='square', size=1, fill_color='red', source=self.source)
        p.title.text = filename
        p.title.text_color = 'orange'
        p.xaxis.axis_label = 'T'
        p.yaxis.axis_label = y_label
        p.xaxis.minor_tick_line_color = 'red'
        p.yaxis.minor_tick_line_color = None
        return p

И мой основной выглядит так (настроен на передачу до 100 тысяч точек данных из файла): web

p = readMyFile(path+filename+extension, 100000)
t = p.time()
a = p.a()
b = p.b()
c = p.c()
d = p.d()
v = bokehPlot(filename, t, a, b, c, d)

Переменные t, a, b, c и d имеют тип numpy ndarray.

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

В этом коде я могу нарисовать поле выбора, но оно просто на мгновение остается, затем исчезает, и я не вижу никакого эффекта на любом графике. Как box_select связан с источником и что вызывает перерисовку графиков?

Это всего лишь один шаг в попытке познакомиться с Боке. Моей следующей целью будет использование TSNE для кластеризации моих данных и отображения кластеров с синхронизированными цветами на каждом графике. Но сначала я хочу понять механизм использования данных столбца, установленных здесь. Например, в примере кода я не вижу явной связи между операцией box_select и исходной переменной и тем, что вызывает перерисовку графика.

1 Ответ

0 голосов
/ 19 ноября 2018

Насколько я понимаю, BooleanFilter, IndexFilter и GroupFilter могут использоваться для фильтрации данных на одном из ваших графиков перед рендерингом. Если вы хотите, чтобы только второй график реагировал на события в первом графике, вам следует просто использовать gridplot, как предлагается в комментарии. Пока участки имеют одинаковые ColumnDataSource, они должны быть связаны.

from bokeh.layouts import gridplot
from bokeh.models import ColumnDataSource
from bokeh.plotting import figure, show

source = ColumnDataSource(data=dict(x=[1, 2, 3, 4, 5], 
                                    y=[1, 2, 3, 4, 5], 
                                    z=[3, 5, 1, 6, 7]))

tools = ["box_select", "hover", "reset"]
p_0 = figure(plot_height=300, plot_width=300, tools=tools)
p_0.circle(x="x", y="y", size=10, hover_color="red", source=source)

p_1 = figure(plot_height=300, plot_width=300, tools=tools)
p_1.circle(x="x", y="z", size=10, hover_color="red", source=source)

show(gridplot([[p_0, p_1]]))
...