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

时间:2015-12-15 09:44:58

标签: matplotlib ipython-notebook bokeh

我在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 个答案:

答案 0 :(得分: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)
相关问题