在bokeh中与multi_line交互

时间:2015-12-03 06:41:41

标签: python ipython-notebook interactive bokeh

尝试在Bokeh中绘制2条线,并根据2个滑块的输入同时更新它们。当我使用multi_line时,这些行不会更新。

使用ipython notebook:

%matplotlib inline
import numpy as np    
from ipywidgets import interact

from bokeh.models import Line, ColumnDataSource
from bokeh.plotting import figure, show
from bokeh.io import output_notebook

定义2个简单的函数,它们在相同的x值上给出了我的2行:

def mu(q,tau,c):
    p = np.maximum((tau-2*q-c),0)
    return p*q

def mu_d(q,tau,c):
    mask = (tau-q-c)<0
    payoff = .25*(tau-q-c)**2
    payoff[mask]=0
    return payoff    

现在制作散景图:

x = np.linspace(0, .6, 200)
y = mu(x,1,.1)
y1 = mu_d(x,1,.1)

output_notebook()

source = ColumnDataSource(data=dict(x=x, y=y, y1=y1))
p = figure(title="simple line example", plot_height=300, plot_width=600, y_range=(0, .25))
# p.line(x, y, source=source, alpha=.5, color="red", line_width=2) #this case works
# p.line(x, y1, source=source, alpha=.5, color="red", line_width=2) #this case does not
p.multi_line([x,x], [y,y1], source=source, alpha=.5, color=["red","blue"], line_width=2) # neither does this


def update(tau=1, c=.1):
    source.data['y'] = mu(x,tau,c)
    source.data['y1'] = mu_d(x,tau,c)
    source.push_notebook()

show(p)

滑块:

interact(update,  tau=(0,1, 0.1), c=(0,.5, 0.1))

为了调试事情,我一直在玩绘制单行。如果我只绘制(x,y),如第一种情况(注释掉),事情就可以了。当我尝试第二种情况时,当滑块更新时,线(x,y1)变为(x,y) - 即使我重新启动内核并注释掉未使用的source.data行(bug? )。我在mu_d()命令中打印了update输出,但在那里看起来很不错,但是他们没有在图中更新。

其他人遇到过这个?所有工具(ipython,散景等)都是最新版本,如Anaconda dist。

1 个答案:

答案 0 :(得分:0)

这不是多线,但有效。如果这可以被矢量化会很好,这样就可以在不写大量代码的情况下一次操作任意数量的行。

#inner p {
text-align: center;
font: 25px/200px Helvetica, sans-serif;
}
#inner p a {
color: #000;
text-decoration: none;
}
#inner p a:hover {
text-decoration: underline;
}