2015-12-15 52 views
1

我在ipython筆記本中使用了散景效果,並希望在打印圖標旁邊有一個按鈕來打開或關閉數據點的標籤。我發現了一個溶液使用IPython.html.widgets.interact,但是這種解決方案復位情節每個更新包括縮放和填補更新散景圖中的數據點標籤

這是最小工作代碼例如:

from numpy.random import random 
from bokeh.plotting import figure, show, output_notebook 
from IPython.html.widgets import interact 

def plot(label_flag): 
    p = figure() 
    N = 10 
    x = random(N)+2 
    y = random(N)+2 
    labels = range(N) 
    p.scatter(x, y) 
    if label_flag: 
     pass 
     p.text(x, y, labels) 

    output_notebook() 
    show(p) 

interact(plot, label_flag=True) 

P.S.如果在matplotlib中有這樣一個簡單的方法,我也會再次切換回去。

回答

1

通過使用bokeh.models.ColumnDataSource來存儲和更改繪圖的數據,我能夠實現我想要的。

一個需要注意的是,我發現沒有辦法讓它在兩個不同的單元格中兩次不刷新而不刷新而不用刷新output_notebook。如果我刪除兩個output_notebook中的一個,則調用tools的gui按鈕看起來中斷或更改設置也會導致圖的重置。

from numpy.random import random 
from bokeh.plotting import figure, show, output_notebook 
from IPython.html.widgets import interact 
from bokeh.models import ColumnDataSource 
output_notebook() 

## <-- new cell --> 

p = figure() 

N = 10 
x_data = random(N)+2 
y_data = random(N)+2 
labels = range(N) 
source = ColumnDataSource(
    data={ 
     'x':x_data, 
     'y':y_data, 
     'desc':labels 
    } 
) 
p.scatter('x', 'y', source=source) 
p.text('x', 'y', 'desc', source=source) 
output_notebook() 

def update_plot(label_flag=True): 
    if label_flag: 
     source.data['desc'] = range(N) 
    else: 
     source.data['desc'] = ['']*N 
    show(p) 

interact(update_plot, label_flag=True) 
+0

double output_notebook()因此而必需:https://github.com/bokeh/bokeh/issues/2024 – Framester