簡體   English   中英

散景,回調中的更改數據不會更改原始python數據

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM