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