列数据源和Box_Select的散景使用

时间:2018-11-18 20:26:15

标签: python bokeh

我不知道如何设置列数据源,这样我就可以从一个图形中选择点,并在另一图形中突出显示相应的点。我正在尝试更多地了解其工作原理。

我使用的示例代码是名为Linked Brushing的示例。我想看看下面的代码是否可以达到相同的效果。该网页说明中也提到了Linked Selection with Filtered Data,但我不了解该页面上的代码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

我的主程序如下所示(设置为从文件中传递最多100K数据点):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如何链接到源,并且是什么导致绘图重绘?

这只是使自己熟悉Bokeh的第一步。我的下一个目标是使用TSNE对数据进行聚类,并在每个图形中显示具有同步颜色的聚类。但是首先,我想了解此处使用列数据集的机制。例如,在示例代码中,我看不到box_select操作与源变量之间的任何显式连接,以及导致绘图重新绘制的原因。

1 个答案:

答案 0 :(得分:0)

我的理解是BooleanFilterIndexFilterGroupFilter可用于在渲染之前过滤其中一个绘图中的数据。如果只希望第二个图响应第一个图中的事件,则应按照注释中的建议使用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]]))