1 回答
TA贡献1827条经验 获得超4个赞
所以有几点建议:
我认为您会希望这两个图都使用相同的方法,因为它们之间的 columndatasource 是通用的,并且如果它们在同一范围内,您可以在它们之间设置 CustomJS 行为。
index
您正在使用的 已经存在于您的self.df
绘图中,一旦它出现在您的绘图中,将更容易与之交互,因为您可以使用 JS 绘图行为来处理它,而不是返回到 python 变量并重新加载数据。不要为“突出显示”点绘制新字形,而是考虑使用内置的“悬停”或“选定”功能。
hover_color='red'
例如,可以替换绘制和移动另一类字形。如果您想保持静态选中状态,以便在屏幕截图中无需鼠标即可生成漂亮的报告,请使用的内置selected
属性定义回调ColumnDataSource
我可以发布一些带有更具体示例的实际代码块,但如果这些点中的任何一点对于您的实际用例来说是一个硬停止,它将推动解决方案。
编辑:
所以我使用一个类方法非常接近 - 问题是能够从第一个方法编辑第二个图,而不是对它ColumnDataSource
本身的实际更改。
def plot_it(self):
self.plot_signal = figure(x_range=(450, 550), y_range=(-1, 1), title='signal')
self.plot_signal.line(x='index', y='z', source=self.source)
self.plot_signal.segment(x0=500, y0=-2, x1=500, y1=2, source=self.source)
self.plot_path = figure(title='sensor')
self.plot_path.scatter(x='x', y='y', source=self.source, hover_color='red')
jscode='''
var data = source.data;
var plot_signal = plot_signal;
var index = cb_data.index['1d'].indices;
var xmin = 0;
var xmax = 0;
if (index > 0) {
xmin = index[0] - 50;
xmax = index[0] + 50;
plot_signal.x_range.end = xmax;
plot_signal.x_range.start = xmin;
plot_signal.change.emit();
}
hover_callback = CustomJS(args=dict(source=self.source, plot_signal=self.plot_signal), code=jscode)
hover.tooltips = [('index', '@index'), ('sensor', '@z')]
self.plot_path.add_tools(hover)
def get_grid(self):
self.plot_it()
grid = gridplot([[self.plot_path], [self.plot_signal]])
return grid
除了移动线段之外,这应该做所有事情。我找不到要添加的段命名约定plot_signal.SOMEOBJECT.x0,.x1但它只会if (index > 0)像使用index[0]. 我去掉了一些样式选项,因为我正在从另一台计算机转录。
这个关于移动线段的问题可能会为您提供段 JSON 对象的语法。
添加回答
举报