[英]bokeh, change data in callback does not change original python data
我正在开发一种手动分类工具,该工具更改散景散点图中选择的某些点(在我的情况下为颜色)的属性。 我通过 s.data = d2 和 s.change.emit() 在回调中更改了源数据,但都失败了。 我以为这样的操作会改变source.data,但是当我打印source.data时,实际上什么也没发生。 不过,图中点的颜色会按预期发生变化。 这是我的相关代码:
DF = pd.read_csv(csv_path)
s = ColumnDataSource(DF_file)
p = figure(plot_width=500, plot_height=500, tooltips=TOOLTIPS,tools="lasso_select, tap", title="manual classification")
circles = p.circle('x', 'y', color='color', size=10, source=s, line_alpha=0.6,fill_alpha=0.6)
s.callback = CustomJS(args=dict(s1=s), code="""
var inds = cb_obj.selected.indices;
var d1 = s1.data;
for (var i = 0; i < inds.length; i++)
{d1['color'][inds[i]] = 'green';}
s1.change.emit();
""")
print(s.data) 和从 s.to_csv(xxx) 保存的 csv 文件都显示原始输入数据没有变化。 另外,我想知道当 python 中的数据是args=(s1=s)
传递给它的数据时,回调如何工作来更改绘图的数据,同时保持 python 中的数据不变。
我搜索了一些可能的方法,并在https://discourse.bokeh.org/t/getting-selected-glyph-data-properties-via-customjs/4311/5?u=1113 中找到了这个答案
当 Bokeh JS 对象被实例化时,它使用 Python 对象作为数据源,但实际上与它们断开连接 - 因此对 JS 模型的更新不会传播回它们的 Python 父对象。
虽然此网页中的讨论还提出了使用 IPython.notebook.kernel.execute 在 Python 中创建或覆盖变量的解决方法。 它只能用于笔记本前端(我发现此解决方法仅在代码中使用 output_notebook() 时才有效)。
然后这是我在python中更改原始数据的新代码:
s.callback = CustomJS(args=dict(s1=s1), code="""
var inds = s1.selected.indices;
var d1 = s1.data;
for (var i = 0; i < inds.length; i++)
{
d1['color'][inds[i]] = 'red';
var index = inds[i];
var command = "s1.data['color'][" + index + "] = red";
var kernel = IPython.notebook.kernel;
kernel.execute(command);
}
s1.change.emit();;
""")
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.