在散景中与 multi_line 互动
interacting with multi_line in bokeh
尝试在 Bokeh 中绘制 2 条线并根据来自 2 个滑块的输入同时更新它们。当我使用 multi_line 时,行不会更新。
使用 ipython 笔记本:
%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
行(错误?)。我已经在 update
命令中打印了 mu_d()
输出,那里看起来不错,但它们没有在图中更新。
还有其他人遇到过这个吗?所有工具(ipython、bokeh 等)都是 Anaconda 发行版中的最新版本。
这不是多行,但有效。如果可以将其矢量化,那就太好了,这样就可以一次操作任意数量的行,而无需编写大量代码。
source1 = ColumnDataSource(data=dict(x=qgrid, y=mugrid))
source2 = ColumnDataSource(data=dict(x=qgrid, y=mudgrid))
p.line(qgrid, mugrid, source=source1, legend='mu(q)',line_color="blue",alpha=.6)
p.line(qgrid, mudgrid,source=source2,legend='mu_d(q)',line_color="green",alpha=.5)
p.legend.label_text_font = "times"
def update(tau=1, c=.1):
source1.data['y'] = mu(x,tau,c)
source2.data['y'] = mu_d(x,tau,c)
source1.push_notebook()
source2.push_notebook()
show(p)
尝试在 Bokeh 中绘制 2 条线并根据来自 2 个滑块的输入同时更新它们。当我使用 multi_line 时,行不会更新。
使用 ipython 笔记本:
%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
行(错误?)。我已经在 update
命令中打印了 mu_d()
输出,那里看起来不错,但它们没有在图中更新。
还有其他人遇到过这个吗?所有工具(ipython、bokeh 等)都是 Anaconda 发行版中的最新版本。
这不是多行,但有效。如果可以将其矢量化,那就太好了,这样就可以一次操作任意数量的行,而无需编写大量代码。
source1 = ColumnDataSource(data=dict(x=qgrid, y=mugrid))
source2 = ColumnDataSource(data=dict(x=qgrid, y=mudgrid))
p.line(qgrid, mugrid, source=source1, legend='mu(q)',line_color="blue",alpha=.6)
p.line(qgrid, mudgrid,source=source2,legend='mu_d(q)',line_color="green",alpha=.5)
p.legend.label_text_font = "times"
def update(tau=1, c=.1):
source1.data['y'] = mu(x,tau,c)
source2.data['y'] = mu_d(x,tau,c)
source1.push_notebook()
source2.push_notebook()
show(p)