[英]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.