更新散景图中的数据点标签

Update data point labels in bokeh plot

我在 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 中有一种简单的方法可以做到这一点,我也会再次切换回来。

通过使用 bokeh.models.ColumnDataSource 来存储和更改绘图数据,我能够实现我想要的。

需要注意的是,我发现无法使其工作 w/o 刷新 w/o 在两个不同的单元格中调用 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)