我不知道如何设置列数据源,这样我就可以从一个图形中选择点,并在另一图形中突出显示相应的点。我正在尝试更多地了解其工作原理。
我使用的示例代码是名为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操作与源变量之间的任何显式连接,以及导致绘图重新绘制的原因。
答案 0 :(得分:0)
我的理解是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]]))